Geode 原生客户端反序列化 Pdx Instance Impl
Geode native client deserialise PdxInstanceImpl
我有一个 REST 客户端,它使用 Json 数据填充 Geode 区域,Geode REST API 自动将这些数据转换为 PdxInstance 类型。
区域触发 C# 本机客户端侦听器 AfterCreate(EntryEvent<TKey, TVal> ev)
,其中 TVal
类型 ev.NewValue
被视为类型 PdxInstanceImpl
并且看起来像:
PDX[7534066,__GEMFIRE_JSON]{@type=MyClass, Field1=Value1, Field2=Value2}
我从here看到下面的代码可以获取到各个Pdx字段
IPdxInstance pdx = (IPdxInstance)ev.NewValue;
pdx.GetField("Field1");
这适用于 Field 级别,但我想将收到的 PdxInstanceImpl
转换为 PdxInstance
,以便可以直接将其放入另一个区域,或者我想转换所有将字段返回 Json(作为字符串)1 去并将 Json 字符串放入另一个区域,或按我喜欢的方式使用它。
所以显然有一种方法可以将 PdxInstance
自动序列化为 MyClass
但是如果我尝试
MyClass c = (MyClass)pdx;
然后我得到 System.InvalidCastException: Unable to cast object of type 'Apache.Geode.Client.Internal.PdxInstanceImpl' to type 'MyClass'
我从一些 Java client examples 那里看到您可以使用类型 PdxInstanceImpl
来获取数据,但是在 C# 本机客户端中会出现错误:PdxInstanceImpl is inaccessible due to its protection level
.
我添加了autoserializer,结果是一样的。
知道我在这里遗漏了什么吗?谢谢
最后我使用了一个字段一个字段的方法:
IPdxInstance pdx = (IPdxInstance)ev.NewValue;
pdx.GetField("Field1");
pdx.GetField("Field2");
pdx.GetField("Field3");
etc...
在事件处理程序之外,我使用以下方法创建 PDX 实例:
IPdxInstanceFactory writer = Setup.g.GetCache().CreatePdxInstanceFactory("myType");
writer.WriteString("String", "s");
writer.WriteChar("Char", 'c');
writer.WriteDouble("Double", Convert.ToDouble(1000));
IPdxInstance pdx = writer.Create();
读取 PDX 实例:
IPdxInstance pdx = Setup.gpg.GeodeGetPdx("myType", key);
MyType t = new MyType();
t.String1 = (string)pdx.GetField("String1");
t.Int1 = (int)pdx.GetField("Int1");
t.Date1 = (DateTime)pdx.GetField("Date1");
etc...
我有一个 REST 客户端,它使用 Json 数据填充 Geode 区域,Geode REST API 自动将这些数据转换为 PdxInstance 类型。
区域触发 C# 本机客户端侦听器 AfterCreate(EntryEvent<TKey, TVal> ev)
,其中 TVal
类型 ev.NewValue
被视为类型 PdxInstanceImpl
并且看起来像:
PDX[7534066,__GEMFIRE_JSON]{@type=MyClass, Field1=Value1, Field2=Value2}
我从here看到下面的代码可以获取到各个Pdx字段
IPdxInstance pdx = (IPdxInstance)ev.NewValue;
pdx.GetField("Field1");
这适用于 Field 级别,但我想将收到的 PdxInstanceImpl
转换为 PdxInstance
,以便可以直接将其放入另一个区域,或者我想转换所有将字段返回 Json(作为字符串)1 去并将 Json 字符串放入另一个区域,或按我喜欢的方式使用它。
所以显然有一种方法可以将 PdxInstance
自动序列化为 MyClass
但是如果我尝试
MyClass c = (MyClass)pdx;
然后我得到 System.InvalidCastException: Unable to cast object of type 'Apache.Geode.Client.Internal.PdxInstanceImpl' to type 'MyClass'
我从一些 Java client examples 那里看到您可以使用类型 PdxInstanceImpl
来获取数据,但是在 C# 本机客户端中会出现错误:PdxInstanceImpl is inaccessible due to its protection level
.
我添加了autoserializer,结果是一样的。
知道我在这里遗漏了什么吗?谢谢
最后我使用了一个字段一个字段的方法:
IPdxInstance pdx = (IPdxInstance)ev.NewValue;
pdx.GetField("Field1");
pdx.GetField("Field2");
pdx.GetField("Field3");
etc...
在事件处理程序之外,我使用以下方法创建 PDX 实例:
IPdxInstanceFactory writer = Setup.g.GetCache().CreatePdxInstanceFactory("myType");
writer.WriteString("String", "s");
writer.WriteChar("Char", 'c');
writer.WriteDouble("Double", Convert.ToDouble(1000));
IPdxInstance pdx = writer.Create();
读取 PDX 实例:
IPdxInstance pdx = Setup.gpg.GeodeGetPdx("myType", key);
MyType t = new MyType();
t.String1 = (string)pdx.GetField("String1");
t.Int1 = (int)pdx.GetField("Int1");
t.Date1 = (DateTime)pdx.GetField("Date1");
etc...