【问题标题】:Protobuf-net is not serializing? Output nearly plain textProtobuf-net 没有序列化?输出几乎纯文本
【发布时间】:2014-09-23 13:24:52
【问题描述】:

我是 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);
}

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

感谢您的帮助!

【问题讨论】:

  • 因为NameAddress 是字符串,所以这些值是可读的。如果你不想这样,你可以使用CryptoStream
  • 如果您反序列化您的文件,因此恢复的类是否与原始类相同?还是有一些实际的区别?
  • 为什么你认为它序列化不正确吗?
  • @Peter:我希望所有数据都是某种不可读的二进制格式。但我认为 Plutonix 对我来说是正确的答案。由于这些值是字符串,它们稍后将在输出中可读。
  • @ffyhlkain 为什么? protobuf 文档的哪一部分让您做出了这样的推断? UTF8 一种二进制格式。文档中没有任何内容表明一切都应该是不可读的。

标签: c# serialization protobuf-net


【解决方案1】:

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

  1. 文件几乎可读(并且包含对大多数文本编辑器清晰可见的原始文本值)
  2. 文件大小与原始内容差别不大

基本上:对我来说看起来不错。如果你想压缩它,也可以通过GZipStreamDeflateStream 之类的东西运行它(显然是双向的)。附带说明:如果您的 real 数据将包含大量重复数据,protobuf-net 有一些选择加入标志以允许对象和字符串重用(仅存储令牌,而不是每次整个字符串) - 但是,将其读入其他协议缓冲区库(即不是 protobuf-net)会很尴尬,因为此功能不是核心规范的一部分。

【讨论】:

  • 好的,感谢@Marc 用优化标志指出这一点。我正在寻找确切的信息,因为我将有几个重复的数据并且我想要优化。
  • @ffyhlkain AsReference 特别是
猜你喜欢
  • 2021-01-14
  • 1970-01-01
  • 2012-08-31
  • 2013-06-16
  • 2011-10-03
  • 1970-01-01
  • 2015-09-10
  • 2012-04-26
  • 1970-01-01
相关资源
最近更新 更多