我是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);
}
我期待我遗漏某些东西,因为输出文件的大小不是我所期望的。
感谢您的帮助!
答案 0 :(得分:3)
您的数据以文字为主。 protobuf有线格式将文本编码为UTF-8,因此有意义:
基本上:对我来说很好看。如果你想要压缩它,也可以通过类似GZipStream
或DeflateStream
的方式运行它(显然是两个方向)。作为旁注:如果您的真实数据将包含大量重复数据,protobuf-net会有一些选择加入标记,以允许对象和字符串重用(仅存储令牌,而不是存储令牌)每次都是整个字符串) - 然而,将其读入其他协议缓冲库(即不是protobuf-net)会很尴尬,因为此功能不是核心规范的一部分。