[英]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
这样的东西使用第一个; 像DataContractSerializer
和BinaryFormatter
这样的东西使用第3个; 好消息是protobuf-net 支持所有5个 。 我建议在你的情况下,最好的选择是使用此类型的第3个选项,您可以通过以下方式执行:
[ProtoContract(SkipConstructor=true)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.