C# Protobuf网络未序列化?输出几乎纯文本

C# Protobuf网络未序列化?输出几乎纯文本,c#,serialization,protobuf-net,C#,Serialization,Protobuf Net,我是protobuf的初学者,我遇到了一个问题,希望您能帮助我: 我尝试了protobuf网页的[示例][1],并使其运行起来。我扩展了它,不仅存储了一个人,还存储了另一个数据类,其中包含10000人的列表。然后我序列化了该数据类并查看了输出。我希望看到一些二进制内容,但惊讶地发现几乎所有内容都是纯文本: π`Fred Flat 1The Meadows π`Fred Flat 1The Meadows π`Fred Flat 1The Meadows π`Fred Flat 1The

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

我尝试了protobuf网页的[示例][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; }
    }
}
名称空间SNSClient.Assets.Scripts.GamePlay.Testing
{
[原始合同]
班主任
{
[原成员(1)]
公共int Id{get;set;}
[原成员(2)]
公共字符串名称{get;set;}
[原成员(3)]
公共广播地址{get;set;}
}
[原始合同]
班级地址
{
[原成员(1)]
公共字符串Line1{get;set;}
[原成员(2)]
公共字符串第2行{get;set;}
}
[原始合同]
类MyProtoDataHolder
{
[原成员(1)]
公共列表人员{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);
}
List dataList=newlist();
对于(int i=0;i<100000;i++)
{
var person=新的人{
id=12345,Name=“Fred”,
地址=新地址{
Line1=“平面1”,
Line2=“草地”
}
};
数据列表。添加(个人);
}
var data=new MyProtoDataHolder(){persons=dataList};
使用(var file=file.Create(Application.dataPath+“/dataList.bin”))
{
序列化器。序列化(文件、数据);
}
我希望我遗漏了一些东西,因为输出文件的大小不是我所期望的


谢谢你的帮助

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

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

  • 基本上:我觉得很好。如果您想要压缩它,那么也可以通过类似
    gzip流
    DeflateStream
    的方式运行它(显然是双向的)。作为旁注:如果您的真实数据将有大量重复数据,protobuf net有一些opt-in标志以允许对象和字符串重复使用(每次只存储一个令牌,而不是整个字符串)-但是,将其读入其他协议缓冲库(即非protobuf net)会很尴尬,由于此功能不是核心规范的一部分。

    由于
    名称
    地址
    是字符串,因此值是可读的。如果您不想这样做,您可以使用。如果您反序列化您的文件,那么由此还原的类是否与原始类相同?或者有什么实际的区别?为什么你认为序列化是不正确的?@Peter:我希望所有的数据都是某种不可读的二进制格式。但我认为普罗泰克斯对我来说有正确的答案。由于这些值是字符串,以后在输出中可以读取。@ffyhlkain为什么?protobuf文档的哪一部分让你推断出了这一点?UTF8是一种二进制格式。文档中没有任何内容表明所有内容都不可读。好的,谢谢@Marc用opitmization标志指出这一点。我一直在寻找准确的数据,因为我将有几个重复的数据,并且我想对其进行优化。@ffyhlkain
    AsReference