# Non-serializable AlphanumComparator

**URL:** <https://forum.inductiveautomation.com/t/non-serializable-alphanumcomparator/95495>\
**Category:** Ignition\
**Tags:** vision, perspective, scripting\
**Created:** [September 3, 2024, 4:29pm UTC](https://forum.inductiveautomation.com/t/non-serializable-alphanumcomparator/95495 "2024-09-03T16:29:20Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [September 3, 2024, 4:29pm UTC](https://forum.inductiveautomation.com/t/non-serializable-alphanumcomparator/95495/1 "2024-09-03T16:29:20Z")

</div>

I make heavy use of the following when presenting information to users so that they see items in natural order:

```python
from java.util.concurrent import ConcurrentSkipListMap
from com.inductiveautomation.ignition.common.util import Comparators
ciAlnumCmp = Comparators.alphaNumeric(False)

def someAPI():
	someOutput = ConcurrentSkipListMap(ciAlnumCmp)
	for ....:
		someOutput.put(someKey, someContent)
	return someOutput

```

This pattern delivers a duck-typed dictionary that will use the human-friendly natural order of the keys when iterating over the keys or the items.

Which is wonderful when working purely in Perspective or Vision, but not so great when using RPC in any form. Because Ignition's Comparator class is not marked serializable. And even if it were, it actually hands out an instance of `com.jidesoft.comparator.AlphanumComparator`. Which also is **not** marked serializable.

In other words, putting `@system.util.runInGateway` ahead of that example `def` blows up when you call that from Vision or a designer. Gateway to gateway requests would also blow up. ☹

A wrapper class around the JideSoft class, marked serializable, is probably all that's needed. But cannot be jython, as jython classes are never serializable.

I'm inclined to add this to my Integration Toolkit, but I'd be happier if it happened 1st party....

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [September 3, 2024, 4:57pm UTC](https://forum.inductiveautomation.com/t/non-serializable-alphanumcomparator/95495/2 "2024-09-03T16:57:41Z")

</div>

Making Java serialization easier is generally not in the cards. Just make a util that returns an OrderedDict as output, from some dictionary-like input?

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [September 3, 2024, 4:59pm UTC](https://forum.inductiveautomation.com/t/non-serializable-alphanumcomparator/95495/3 "2024-09-03T16:59:04Z")

</div>

> [@paul-griffith](#):
>
> make a util

Did:

```python
def makeUncasedMap(initializer = None):
	output = ConcurrentSkipListMap(ciAlnumCmp)
	if initializer:
		output.update(initializer)
	return output

```

Sigh.
