繁体   English   中英

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

[英]Inconsistencies after deserialization using 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;
}

在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;
}

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

我做的序列化如下:

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

并做反序列化,如:

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

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

提前致谢!!

(来自评论)

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

啊,的确如此。 在对象构造方面有各种方法:

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

XmlSerializer这样的东西使用第一个; DataContractSerializerBinaryFormatter这样的东西使用第3个; 好消息是protobuf-net 支持所有5个 我建议在你的情况下,最好的选择是使用此类型的第3个选项,您可以通过以下方式执行:

[ProtoContract(SkipConstructor=true)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM