2016-12-09 105 views
1

我有這樣的拓撲。 1服務器節點的java 1個客戶端節點上運行的上達網絡運行Ignite Java .NET互操作性java.sql.Timestamp到System.DateTime

我有具有在Java端的場

java.sql.Timestamp lastUpdated 

兩個平臺上定義的簡單類型,

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] 

回答

2

.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

+0

工作。謝謝帕維爾。 –