提问者:小点点

Geode原生客户端反序列化PdxInstanceImpl


我有一个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,结果是相同的。

知道我错过了什么吗?谢谢


共1个答案

匿名用户

最后,我使用了逐场方法:

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...