Protobuf-net如何序列化List <t> </t>

时间:2015-01-14 16:29:47

标签: c# serialization protobuf-net

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

// 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找到无参数构造函数

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

2 个答案:

答案 0 :(得分:0)

您有几个选择:

  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

答案 1 :(得分:-2)

如果使用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);