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 的新手,所以请指出任何错误(我相信有很多错误)。
提前致谢!!
(来自评论)
我已经找到问题所在,基本上有一个需要反序列化的列表。而这个列表是一个事件列表,其中事件的构造函数都有参数,当它尝试反序列化时,程序会运行无参数的构造函数(我手动添加了这些构造函数,以消除异常)而不是正确的那些(带参数)。我知道这是序列化/反序列化的工作方式,但是有没有办法正确地序列化和反序列化这个列表?
啊,确实。在对象构造方面有多种方法:
像XmlSerializer使用第一个这样的东西;喜欢DataContractSerializer和BinaryFormatter使用第三个的东西;好消息是 protobuf-net支持所有 5 . 我建议在您的情况下,最好的选择是对这种类型使用第三个选项,您可以通过以下方式进行:
[ProtoContract(SkipConstructor=true)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1329 次 |
| 最近记录: |