C# Protobuf net序列化字节[]数据,每个字节前加“00”

C# Protobuf net序列化字节[]数据,每个字节前加“00”,c#,serialization,protobuf-net,C#,Serialization,Protobuf Net,我正在使用Visual Studio 2005和protobuf net r480的.Net20版本 我试着按照下面的示例,用string、enum、int和byte[]数据序列化一个类,如下所示 [ProtoContract] public class Proto_DemoMessage { public enum ESSCommandType : int { ClientServer = 0, Broadcast = 10, Assig

我正在使用Visual Studio 2005和protobuf net r480的.Net20版本

我试着按照下面的示例,用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;
    }
调用internal_message.Serialize后,我将结果字节[]写入一个文件。当我以十六进制模式打开文件进行验证时,我发现byte[]中的每个字节后面都有一个00填充。 结果是:

2A 14 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00 39 00 30 00

我做错什么了吗?谢谢你的帮助。

一切都好。您的字符串是用UTF-16编码的。在此编码中,所有字符至少有两个字节宽。

一切正常。您的字符串是用UTF-16编码的。在这种编码中,所有字符至少有两个字节宽。

当我检查这些零是否确实是因为Unicode编码时,我还检查了UTF8是否比预期的更紧凑,因此使用

inner_message.BytesData = System.Text.Encoding.UTF8.GetBytes("1234567890");
也许会有好处


upd:或者按照Marc Gravell的建议使用字符串属性。

当我检查这些零是否确实是因为Unicode编码时,我还检查了UTF8是否比预期的更紧凑,因此使用

inner_message.BytesData = System.Text.Encoding.UTF8.GetBytes("1234567890");
也许会有好处


upd:或者按照Marc Gravell的建议使用字符串属性。

实际上,可能有两个问题!我收回!内存流使用和错误编码。很抱歉我犯了一个错误。我很抱歉,我真诚的道歉。@MarcGravel别担心!但你真的让我一时糊涂了!:是的,很抱歉。这个不寻常的MemoryStream复制代码把我甩了,我追错了线索。完全是我的错。事实上,可能有两个问题!我收回!内存流使用和错误编码。很抱歉我犯了一个错误。我很抱歉,我真诚的道歉。@MarcGravel别担心!但你真的让我一时糊涂了!:是的,很抱歉。这个不寻常的MemoryStream复制代码把我甩了,我追错了线索。完全是我的错。你把你的记忆流密码扔给了我。。。你可以直接用。到那里去——那会更直接。但是蝉是完全正确的;您将字节数据作为UTF-16包含;其中ASCII范围字符为零。这完全是自作自受,通过你用MemoryStream代码扔给我的BytesData=Line。。。你可以直接用。到那里去——那会更直接。但是蝉是完全正确的;您将字节数据作为UTF-16包含;其中ASCII范围字符为零。这完全是自作自受的,通过BytesData=line,我会说:如果你想存储一个字符串,比如1234567890,那么就拥有一个string属性,让序列化程序担心编码;p@Marc格雷威尔:或者那样。它是否完全自动支持unicode开箱即用?默认情况下它是如何编码的?是的,Google的protobuf规范明确规定UTF-8用于字符数据,因此一个简单的字符串可以正常工作,并根据您的答案通过UTF-8进行编码。当然,如果字段实际上是一个字符串,那么使用字符串会更好,但是根据名称ByteData的语义,我会说这些实际上是字节,OP只是测试它是否有效。是的,我只是以字符串为例测试对byte[]数据类型的支持。实际上,byte[]中的内容将是另一个序列化消息,但我在没有通知的情况下错误地使用了Unicode编码。也许有更好的方法来测试它。谢谢大家的建议。我想说:如果你想存储一个字符串,比如1234567890,那么就拥有一个string属性,让序列化程序来担心编码;p@Marc格雷威尔:或者那样。它是否完全自动支持unicode开箱即用?默认情况下它是如何编码的?是的,Google的protobuf规范明确规定UTF-8用于字符数据,因此一个简单的字符串可以正常工作,并根据您的答案通过UTF-8进行编码。当然,如果字段实际上是一个字符串,那么使用字符串会更好,但是根据名称ByteData的语义,我会说这些实际上是字节,OP只是测试它是否有效。是的,我只是以字符串为例测试对byte[]数据类型的支持。实际上,byte[]中的内容将是另一个序列化消息,但我在没有通知的情况下错误地使用了Unicode编码。也许有更好的方法来测试它。谢谢大家的建议。