使用protobuf-net反序列化后的不一致

Lin*_*Lin 4 c# serialization protocol-buffers protobuf-net

我在使用 protobuf-net 反序列化后面临不一致的问题。

我想序列化/反序列化的类看起来像:

[ProtoContract]
public class TSS
{
    [ProtoMember(1, AsReference = true)]
    public EventManager eventManager { get; private set; }

    [ProtoMember(2)]
    public DateTime referenceDateTime { get; private set; }

    [ProtoMember(3)]
    public Mode mode;
}
Run Code Online (Sandbox Code Playgroud)

在 EventManager 类中,它看起来像:

[ProtoContract]
public class EventManager
{
    [ProtoMember(1)]
    public InputQueue inputQueue = new InputQueue();
    [ProtoMember(2)]
    public InputQueue InputQueue
    {
        get { return this.inputQueue; }
        set { this.inputQueue = value; }
    }
    [ProtoMember(7, AsReference = true)]
    public TSS tss;
}
Run Code Online (Sandbox Code Playgroud)

EventManager类中的tss是TSS对象的引用,TSS类中的eventManager是EventManager对象的引用。这就是我放在AsReference = true那里的原因(这是正确的方法吗?)

我做序列化,如:

public void StateSaving(int time, TSS tss)
{
    Stream memoryStream = new MemoryStream();
    Serializer.Serialize(memoryStream, tss);
    states.Add(time, memoryStream);
}
Run Code Online (Sandbox Code Playgroud)

并进行反序列化,例如:

public void Deserialize(int time, ref TSS tss)
{
    Stream memoryStream = states[time];
    memoryStream.Position = 0;
    tss = Serializer.Deserialize<TSS>(memoryStream);
}
Run Code Online (Sandbox Code Playgroud)

问题是,每当我进行反序列化时,EventManager 中的 inputQueue 等数据结构都会填充 NULL 值而不是当时的实际值。我是 protobuf-net 的新手,所以请指出任何错误(我相信有很多错误)。

提前致谢!!

Mar*_*ell 5

(来自评论)

我已经找到问题所在,基本上有一个需要反序列化的列表。而这个列表是一个事件列表,其中事件的构造函数都有参数,当它尝试反序列化时,程序会运行无参数的构造函数(我手动添加了这些构造函数,以消除异常)而不是正确的那些(带参数)。我知道这是序列化/反序列化的工作方式,但是有没有办法正确地序列化和反序列化这个列表?

啊,确实。在对象构造方面有多种方法:

  • 使用无参数构造函数
  • 寻找匹配所有定义成员的构造函数
  • 完全跳过构造函数
  • 使用自定义对象工厂
  • 使用代理对象和自定义转换

像XmlSerializer使用第一个这样的东西;喜欢DataContractSerializer和BinaryFormatter使用第三个的东西;好消息是 protobuf-net支持所有 5 . 我建议在您的情况下,最好的选择是对这种类型使用第三个选项,您可以通过以下方式进行:

[ProtoContract(SkipConstructor=true)]
Run Code Online (Sandbox Code Playgroud)