Protobuf-net不是序列化的?输出几乎纯文本

时间:2014-09-23 13:24:53

标签: c# serialization protobuf-net

我是protobuf的初学者,我遇到了一个问题,希望你能帮助我:

我尝试了protobuf-net页面的[示例] [1]并让它运行。我扩展了它,不仅存储了一个人,而且另一个数据类包含10000个人的列表。然后我序列化了该数据类并查看了输出。我希望看到一些二进制文件,并且很惊讶地看到几乎所有内容都是纯文本:

 π`Fred
Flat 1The Meadows
 π`Fred
Flat 1The Meadows
 π`Fred
Flat 1The Meadows
 π`Fred
Flat 1The Meadows
 π`Fred
...

我的代码非常简单:

namespace SNSClient.Assets.Scripts.GamePlay.Testing
{
    [ProtoContract]
    class Person 
    {
        [ProtoMember(1)]
        public int Id {get;set;}
        [ProtoMember(2)]
        public string Name {get; set; }
        [ProtoMember(3)]
        public Address Address {get;set;}
    }

    [ProtoContract]
    class Address 
    {
        [ProtoMember(1)]
        public string Line1 {get;set;}
        [ProtoMember(2)]
        public string Line2 {get;set;}
    }

    [ProtoContract]
    class MyProtoDataHolder
    {
        [ProtoMember(1)]
        public List<Person> persons { get; set; }
    }
}

序列化:

List<Person> dataList = new List<Person>();
for (int i = 0; i < 100000; i++)
{
    var person = new Person {
    id = 12345, Name = "Fred",
    Address = new Address {
    Line1 = "Flat 1",
    Line2 = "The Meadows"
    }
    };

    dataList.Add(person);
}
var data = new MyProtoDataHolder() {persons = dataList};

using (var file = File.Create(Application.dataPath + "/dataList.bin"))
{
    Serializer.Serialize(file, data);
}

我期待我遗漏某些东西,因为输出文件的大小不是我所期望的。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您的数据以文字为主。 protobuf有线格式将文本编码为UTF-8,因此有意义:

  1. 文件几乎可读(并包含大多数文本编辑器清晰可见的原始文本值)
  2. 文件大小与原始内容差别不大
  3. 基本上:对我来说很好看。如果你想要压缩它,也可以通过类似GZipStreamDeflateStream的方式运行它(显然是两个方向)。作为旁注:如果您的真实数据将包含大量重复数据,protobuf-net会有一些选择加入标记,以允许对象和字符串重用(仅存储令牌,而不是存储令牌)每次都是整个字符串) - 然而,将其读入其他协议缓冲库(即不是protobuf-net)会很尴尬,因为此功能不是核心规范的一部分。