1

protobuf-net r480 の .Net20 バージョンで Visual Studio 2005 を使用しています。

以下の例に従って、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

私が間違ったことはありますか?ご協力ありがとうございます。

4

2 に答える 2

3

すべて問題ありません。文字列は UTF-16 でエンコードされています。このエンコーディングでは、すべての文字は (少なくとも) 2 バイト幅です。

于 2012-05-30T11:44:26.417 に答える
1

これらのゼロが実際にUnicodeエンコーディングによるものかどうかを確認している間、UTF8がよりコンパクトであることも確認しました(予想どおり)。

inner_message.BytesData = System.Text.Encoding.UTF8.GetBytes("1234567890");

何か良いことをするかもしれません。

upd:またはstringMarcGravellの提案に従って実際にプロパティを使用します。

于 2012-05-30T11:53:35.060 に答える