如何使用Apache Geode类型注册表来编写域对象数组

问题描述

我正在一个FIX重复组中,其中报价请求可以具有x条腿。我已经做了一个这样的Leg类:

public class Leg : IPdxSerializable
{
  public string Side { get; set; }
  public decimal Size { get; set; }
  public string ValueDate { get; set; }

  public void ToData(IPdxWriter writer)
  {
    writer.WriteString("Side",Side);
    writer.WriteDouble("Size",Convert.ToDouble(Size));
    writer.WriteString("ValueDate",ValueDate);
  }

  public void FromData(IPdxReader reader)
  {
    Side = reader.readString("Side");
    Size = (decimal) reader.ReadDouble("Size");
    ValueDate = reader.readString("ValueDate");
  }

  public static IPdxSerializable CreateDeserializable()
  {
    return new Leg();
  }

  public Leg () { }
}

报价请求的腿写为这些Leg对象的数组。在报价请求类中,有一个Leg[]声明和一个ToData FromData实现。构建报价请求对象,并将put作为PDX类型writer.WriteObjectArray("Legs",Legs.ToList<object>());进入Geode区域,在该区域中,由PDX Writer将分支数组写入为:

List

我为Leg的{​​{1}}尝试了不同类型的PDX类型和域对象类型,但是当我get GFSH中的对象时,leg数组具有给出错误的味道,例如:

Could not create an instance of a class Leg (through reference chain: org.apache.geode.pdx.internal.PdxInstanceImpl[0]->org.apache.geode.pdx.internal.PdxInstanceImpl["object"])

Could not create an instance of a class Leg (through reference chain: java.util.Vector[0]->org.apache.geode.pdx.internal.PdxInstanceImpl["object"])

我认为这是因为Geode服务器尚未在服务器的Leg中注册TypeRegistry对象类型。从本地客户端的Geode版本10开始,不再有像这样使用的Serializable.RegisterPdxType

Serializable.RegisterPdxType(Leg.CreateDeserializable);

我发现了TypeRegistry类引用,并且在初始化缓存时,区域还将类型注册到缓存中:

_cache.TypeRegistry.RegisterPdxType(Leg.CreateDeserializable);

但仍然出现相同的错误。

如果仅将Legs数组写为一个对象,则会出现相同的错误

writer.WriteObject("Legs",Legs);

如果我将Leg对象转换为string[]表示形式,则可以将WriteStringArrayReadStringArray用作引号请求,而Legs在字符串数组,但是有它自己的问题,我想使用Leg对象数组,最好是PDX包装。我想念什么?

解决方法

您可以使用rupweb:

output.WriteObject(LEGS_KEY_,Legs);

Legs = (Leg[])input.ReadObject(LEGS_KEY_);

代替WriteObjectArray / ReadObjectArray。不知道这些限制是什么。仍在调查中。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...