我有一个REST客户端,它用Json数据填充Geode区域,Geode RESTAPI自动将其转换为PdxInstance类型。
该区域触发C#本机客户端侦听器AfterCreate(EntryEvent
PDX[7534066,__GEMFIRE_JSON]{@type=MyClass, Field1=Value1,Field2=Value2}
我从这里看到以下代码可以获取单个Pdx字段
IPdxInstance pdx = (IPdxInstance)ev.NewValue;
pdx.GetField("Field1");
这在字段级别上有效,但是我想将接收到的PdxInstanceImpl
转换为PdxInstance
,这样它就可以直接放入另一个区域,或者我想将所有字段转换回Json(作为字符串),然后将Json字符串放入另一个区域,或者根据需要使用它。
因此,显然有一种方法可以将PdxInstance
自动序列化为MyClass
,但如果我尝试
MyClass c=(MyClass)pdx;
然后我得到System. InvalidCastException:无法将类型为“Apache.Geode.Client.International.PdxInstanceImpl”的对象转换为类型为“MyClass”
我从一些Java客户端示例中看到,您可以使用typePdxInstanceImpl
获取数据,但在C#本机客户端中会出现错误:由于其保护级别,PdxInstanceImpl无法访问。
我添加了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...