Not a built-in type: class java.math.BigInteger

When doing arithmetic with jython longs, and passing them into system.opc.write*(), I'm getting scary backtraces:

2024/04/09 14:25:26.554 | W [o.e.m.o.s.c.s.OpcUaBinaryStreamEncoder] [14:25:26]: Not a built-in type: class java.math.BigInteger 
2024/04/09 14:25:26.554 | E [o.e.m.o.s.c.t.u.UascClientMessageHandler] [14:25:26]: Error serializing WriteRequest(requestHeader=RequestHeader(authenticationToken=NodeId{ns=0, id=ByteString{bytes=[-26, 5, 108, -104, -37, 42, -45, 18, -38, 80, -126, -52, -109, -75, -125, 53, -121, -92, -33, 97, 14, -39, -93, 101, 87, 61, -77, 108, 17, -1, 70, -15]}}, timestamp=DateTime{utcTime=133571463264750000, javaDate=Tue Apr 09 14:25:26 UTC 2024}, requestHandle=3845013, returnDiagnostics=0, auditEntryId=null, timeoutHint=60000, additionalHeader=null), nodesToWrite=[WriteValue(nodeId=NodeId{ns=1, id=[OfcEdgeIIoT1]Produced0.TS[0]}, attributeId=13, indexRange=null, value=DataValue{value=Variant{value=2977585760}, status=null}), WriteValue(nodeId=NodeId{ns=1, id=[OfcEdgeIIoT1]Produced0.TS[1]}, attributeId=13, indexRange=null, value=DataValue{value=Variant{value=398762}, status=null})]): unknown builtin type: -1 
2024/04/09 14:25:26.554 | org.eclipse.milo.opcua.stack.core.UaSerializationException: unknown builtin type: -1
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.writeBuiltinType(OpcUaBinaryStreamEncoder.java:736)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.writeValue(OpcUaBinaryStreamEncoder.java:654)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.writeVariant(OpcUaBinaryStreamEncoder.java:637)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.writeDataValue(OpcUaBinaryStreamEncoder.java:323)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.writeDataValue(OpcUaBinaryStreamEncoder.java:879)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.types.structured.WriteValue$Codec.encode(WriteValue.java:106)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.types.structured.WriteValue$Codec.encode(WriteValue.java:86)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.codecs.GenericDataTypeCodec$GenericBinaryDataTypeCodec.encode(GenericDataTypeCodec.java:54)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.writeStruct(OpcUaBinaryStreamEncoder.java:941)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.lambda$writeStructArray$3(OpcUaBinaryStreamEncoder.java:1107)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.writeArray(OpcUaBinaryStreamEncoder.java:83)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.writeStructArray(OpcUaBinaryStreamEncoder.java:1107)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.writeStructArray(OpcUaBinaryStreamEncoder.java:1123)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.types.structured.WriteRequest$Codec.encode(WriteRequest.java:85)
2024/04/09 14:25:26.556 |       at org.eclipse.milo.opcua.stack.core.types.structured.WriteRequest$Codec.encode(WriteRequest.java:69)
2024/04/09 14:25:26.557 |       at org.eclipse.milo.opcua.stack.core.serialization.codecs.GenericDataTypeCodec$GenericBinaryDataTypeCodec.encode(GenericDataTypeCodec.java:54)
2024/04/09 14:25:26.557 |       at org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder.writeMessage(OpcUaBinaryStreamEncoder.java:918)
2024/04/09 14:25:26.557 |       at org.eclipse.milo.opcua.stack.client.transport.uasc.UascClientMessageHandler.lambda$encode$9(UascClientMessageHandler.java:334)
2024/04/09 14:25:26.557 |       at org.eclipse.milo.opcua.stack.core.channel.SerializationQueue.lambda$encode$0(SerializationQueue.java:59)
2024/04/09 14:25:26.557 |       at org.eclipse.milo.opcua.stack.core.util.TaskQueue$TaskWrapper.run(TaskQueue.java:273)
2024/04/09 14:25:26.557 |       at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
2024/04/09 14:25:26.557 |       at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
2024/04/09 14:25:26.557 |       at java.base/java.lang.Thread.run(Unknown Source)

But, only during device startup/shutdown. Once the device is running, it isn't a problem--the values are reaching the other end, and no traces are popping up.

Edge IIoT v8.1.36.

Thanks, I'll have think about how this could fail more gracefully...

When a write happens the DataType attribute is read from the server and used to coerce the value from an Ignition platform type to an OPC UA type, if necessary. In this case it's necessary. When reading the DataType attribute fails I think we just pass on the value anyway and hope for the best, but if it's not an OPC UA type it eventually explodes down in the serialization layer.

Hmmm. Can't catch this, either.