В связанном вопросе я задал вопрос о проблеме с клиентом Geode.Net, использующим типы Geode PDX к объектам (объектам домена), и на этот раз у меня возникла проблема с преобразованием объектов в типы Geode PDX. Кажется, что регион может содержать как сериализованные типы объектов pdx, так и другие типы объектов и / или типы внутренних объектов. Думаю, работая с байтовыми смещениями.
В любом случае, эта ссылка показывает способ проверки типов объектов и их обработки:
// get checks Object type and handles each appropriately
Object myObject = myRegion.get(myKey);
либо как экземпляры PDX, либо как типы объектов домена:
if (myObject instanceof PdxInstance) {
// get returned PdxInstance instead of domain object
PdxInstance myPdxInstance = (PdxInstance)myObject;
затем с GetField
для экземпляра PDX вы можете обновить только 1 поле, очень хорошо ...
Моя проблема связана с объектами домена:
else if (myObject instanceof DomainClass) {
// code to handle domain object instance
При выходе из прослушивателя событий
public void AfterCreate(EntryEvent<TKey, TVal> ev)
В первую очередь я пытаюсь преобразовать ev.NewValue
в Pdx или затем в объект домена и получаю одно из следующего:
Когда значение в регионе равно PdxInstance
, тогда без if (myObject instanceof PdxInstance)
, как указано выше, чтобы предотвратить это, приведение IPdxInstance pdx = (IPdxInstance)ev.NewValue
дает:
System.InvalidCastException: Unable to cast object of type myObject to type
Apache.Geode.Client.IPdxInstance
Чего и следовало ожидать. Кажется, я нарушил PdxSerialisation myObject, создав регион <key, value>
как <string, Object>
, хотя myObject расширяет PdxSerializable и запись ключей и значений в регион проходит через ToData()
переопределение.
Итак, чтобы иметь дело с myObject
напрямую, например myObject = ev.NewValue
или myObject.Field1 = ((myObject)(ev.NewValue)).Field1
или подобные варианты, дает:
Cannot implicitly convert type 'TVal' to 'myObject'
Cannot convert type 'TVal' to 'myObject'
Конечно, преобразование от ev.NewValue
к myObject
должно быть простым, так что же мне не хватает? В противном случае я должен использовать ev.Key
(который выполняет приведение без каких-либо исключений), чтобы снова указать get
значение из области в кеше, используя:
IRegion<string, Object> r = cache.GetRegion<string, Object>(region);
return r[key];
Итак, если объект уже указан в TVal
типе NewValue
, тогда почему я просто не могу получить к нему доступ? :-s
string
неString
, и у меня нет проблем с кастомным ключом. У меня проблема со значениемObject
. Кроме того, для сериализации проблема возникает во время компиляции, я не могу добраться до времени выполнения. Наконец, да, кажется ли проблема с PDX. Для REST нам нужен PDX, но не для объекта внутреннего домена, то есть, если внутренний объект никогда не будет использоваться в емкости REST ... хм - person rupweb   schedule 05.02.2018