Включите совместимость Java .NET с java.sql.Timestamp на System.DateTime.

У меня такая топология. 1 серверный узел, работающий на java 1 клиентский узел, работающий на .net

У меня есть простой тип, определенный на обеих платформах, который имеет поле

java.sql.Timestamp lastUpdated

на стороне Java и

DateTime? LastUpdated { get; set; }

на стороне .net

Я могу без проблем загружать объекты на узел java и узел клиента .net. Я также могу создавать новые экземпляры и помещать их в кеш из узла java. Однако, когда я пытаюсь поместить новый объект в кеш из узла .net, я получаю следующее исключение (из бокового журнала java). Учтите, что если я уберу это поле даты или установлю для него значение null, то я смогу без проблем ставить объекты со стороны .net.

Любые идеи? Спасибо.

[ERROR] 2016-12-09 14:21:48.121 [sys-#24%null%] GridDhtAtomicCache - <D9Cache> Unexpected exception during cache update
org.apache.ignite.binary.BinaryObjectException: Unexpected flag value [pos=33, expected=33, actual=103]
    at org.apache.ignite.internal.binary.BinaryReaderExImpl.checkFlagNoHandles(BinaryReaderExImpl.java:1423) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.binary.BinaryReaderExImpl.readTimestamp(BinaryReaderExImpl.java:1075) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.binary.BinaryReaderExImpl.readTimestamp(BinaryReaderExImpl.java:1070) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.readFixedType(BinaryFieldAccessor.java:722) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read(BinaryFieldAccessor.java:639) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:776) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1481) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.binary.BinaryObjectImpl.deserializeValue(BinaryObjectImpl.java:585) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.binary.BinaryObjectImpl.value(BinaryObjectImpl.java:142) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.CacheObjectContext.unwrapBinary(CacheObjectContext.java:272) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.CacheObjectContext.unwrapBinaryIfNeeded(CacheObjectContext.java:160) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.CacheObjectContext.unwrapBinaryIfNeeded(CacheObjectContext.java:147) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.GridCacheContext.unwrapBinaryIfNeeded(GridCacheContext.java:1752) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.store.GridCacheStoreManagerAdapter.put(GridCacheStoreManagerAdapter.java:565) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.GridCacheMapEntry.innerUpdate(GridCacheMapEntry.java:2425) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateSingle(GridDhtAtomicCache.java:2252) ~[ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal0(GridDhtAtomicCache.java:1652) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal(GridDhtAtomicCache.java:1490) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.processNearAtomicUpdateRequest(GridDhtAtomicCache.java:2950) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.access$600(GridDhtAtomicCache.java:130) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5.apply(GridDhtAtomicCache.java:268) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5.apply(GridDhtAtomicCache.java:266) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:748) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:353) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:277) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:88) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:231) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1238) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:866) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.managers.communication.GridIoManager.access$1700(GridIoManager.java:106) [ignite-core-1.7.0.jar:1.7.0]
    at org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:829) [ignite-core-1.7.0.jar:1.7.0]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_102]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_102]
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_102]

person Gecko    schedule 09.12.2016    source источник


Ответы (1)


.NET DateTime может быть локальным и UTC; Java Timestamp может быть только UTC. Из-за этого Ignite.NET может сериализовать DateTime двумя способами: в стиле .NET (может работать со значениями, отличными от UTC, не работает в Java и SQL) и как Timestamp (выдает исключение для значений, отличных от UTC, правильно работает в Java). и SQL).

Простой обходной путь — пометить поле [QuerySqlField], чтобы обеспечить сериализацию Timestamp.

Вы также можете использовать инструмент IBinarizable и использовать метод IBinaryWriter.WriteTimestamp.

Когда невозможно изменить класс, чтобы пометить поля [QuerySqlField] или реализовать IBinarizable, используйте подход IBinarySerializer.

См. https://apacheignite-net.readme.io/docs/platform-interoperability#type-compatibility для более подробной информации.

person Pavel Tupitsyn    schedule 09.12.2016