繁体   English   中英

Protobuf-net如何序列化列表<T>

[英]Protobuf-net how to serialize List<T>

这是我当前的序列化/反序列化代码

// SERIALIZE
using (var file = File.Create(@"..\..\SavedPCInfo.bin"))
{
    Serializer.Serialize(file, pcs);
}

//DESERIALIZE
if (File.Exists(FileName))
{
     using (var file = File.OpenRead(@"..\..\SavedPCInfo.bin"))
     {
          pcs = Serializer.Deserialize<List<PC>>(file);
     }
}

其中pcsPC对象的列表。 到目前为止,反序列化时出现错误:

找不到适用于PC的无参数构造函数

我不知道为什么它需要无参数的构造函数来反序列化,但是我只是想让反序列化起作用。 关于如何实现的任何想法? 我似乎在这里做错了。

您有两种选择:

  1. PC创建一个私有的无参数构造函数。 将要求反序列化。

  2. [ProtoContract(SkipConstructor = true)]属性应用于PC 在这种情况下,对象将以未初始化状态实例化。

    请谨慎使用此方法:如果您在任何构造函数之外的类中将字段初始化为某些默认值,则不会发生这些初始化。

    例:

     [ProtoContract(SkipConstructor = true)] public class PC { private int _something = 42; public int Something { get { return _something; } } public PC(string foo) { } } 

    在这种情况下, Something将在反序列化的对象上返回0

如果使用诸如json-io之类的序列化库,该序列化库将Java序列化为JSON(反之亦然),则通常不需要添加任何构造函数。 该库将使用对象上的现有构造函数(必要时甚至使用私有构造函数)来实例化您的对象。

转换为JSON格式进行序列化还具有使序列化的数据具有人类可读格式的额外好处。

json-io: https : //github.com/jdereg/json-io编辑JSON: http : //www.jsoneditoronline.org/

一行将序列化您的数据:

String json = JsonWriter.objectToJson(root);

一行将反序列化它:

Object root = JsonReader.jsonToJava(json);

暂无
暂无

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

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