我正在使用Visual Studio 2005和.Net20版本的protobuf-net r480。
我尝试按照示例使用string,enum,int和byte []数据序列化一个类,如下所示
[ProtoContract]
public class Proto_DemoMessage {
public enum ESSCommandType : int {
ClientServer = 0,
Broadcast = 10,
Assign = 11,
}
[ProtoMember(1, IsRequired = false)]
public string Name;
[ProtoMember(3, IsRequired = true)]
public ESSCommandType CommandType;
[ProtoMember(4, IsRequired = false)]
public int Code;
[ProtoMember(5, IsRequired = false)]
public byte[] BytesData;
public byte[] Serialize(){
byte[] b = null;
using (MemoryStream ms = new MemoryStream()) {
Serializer.Serialize<Proto_DemoMessage>(ms, this);
b = new byte[ms.Position];
byte[] fullB = ms.GetBuffer();
Array.Copy(fullB, b, b.Length);
}
return b;
}
并为每个字段赋值如下
Proto_DemoMessage inner_message = new Proto_DemoMessage();
inner_message.Name = "innerName";
inner_message.CommandType = Proto_DemoMessage.ESSCommandType.Broadcast;
inner_message.Code = 11;
inner_message.BytesData = System.Text.Encoding.Unicode.GetBytes("1234567890");
在调用inner_message.Serialize()之后,我将结果byte []写入文件。当我在HEX模式下打开文件进行验证时,我发现byte []中的每个字节后面都有一个00填充。 结果是:
2A 14 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00 39 00 30 00
我做错了吗?感谢您的帮助。
答案 0 :(得分:3)
一切都好。您的字符串以UTF-16编码。在此编码中,所有字符都是(至少)两个字节宽。
答案 1 :(得分:1)
当我检查这些零是否确实是因为Unicode编码时,我还检查了UTF8是否更紧凑(因为它可以预期),所以使用
inner_message.BytesData = System.Text.Encoding.UTF8.GetBytes("1234567890");
可能会有所帮助。
更新:或根据Marc Gravell的建议真正使用string
属性。