【发布时间】: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);
}
我期待我遗漏了一些东西,因为输出文件的大小不是我所期望的。
感谢您的帮助!
【问题讨论】:
-
因为
Name和Address是字符串,所以这些值是可读的。如果你不想这样,你可以使用CryptoStream。 -
如果您反序列化您的文件,因此恢复的类是否与原始类相同?还是有一些实际的区别?
-
为什么你认为它是序列化不正确吗?
-
@Peter:我希望所有数据都是某种不可读的二进制格式。但我认为 Plutonix 对我来说是正确的答案。由于这些值是字符串,它们稍后将在输出中可读。
-
@ffyhlkain 为什么? protobuf 文档的哪一部分让您做出了这样的推断? UTF8 是一种二进制格式。文档中没有任何内容表明一切都应该是不可读的。
标签: c# serialization protobuf-net