1

Protobufライブラリと次のクラスでC#を使用して作成された.binファイルがあります。

[ProtoContract]
class TextureAtlasEntry
{
    [ProtoMember(1)]
    public int Height { get; set; }

    [ProtoMember(2)]
    public string Name { get; set; }

    [ProtoMember(3)]
    public int Width { get; set; }

    [ProtoMember(4)]
    public int X { get; set; }

    [ProtoMember(5)]
    public int Y { get; set; }
}

関連する.protoファイルは次のようになります

package TextureAtlasSettings;           // Namespace equivalent

message TextureAtlasEntry               
{
    required int32 Height = 1;
    required string Name = 2;
    required int32 Width = 3;
    required int32 X = 4;
    required int32 Y = 5;
}

これはprotoc.exeを介して解析され、TextureAtlasSettings.pb.ccとTextureAtlasSettings.pb.hが生成されます。C++の場合。

結果のバイナリファイルをC++で読みたいので、次のコードを試しました

TextureAtlasSettings::TextureAtlasEntry taSettings;

ifstream::pos_type size;
char *memblock;

ifstream file("Content\\Protobuf\\TextureAtlas0.bin", ios::in | ios::binary);

if (file.is_open())
{
    size = file.tellg();
    memblock = new char[size];
    file.seekg(0, ios::beg);
    file.read(memblock, size);
    file.close();

    fstream input(&memblock[0], ios::in | ios::binary);

    if (!taSettings.ParseFromIstream(&file)) 
    {
        printf("Failed to parse TextureAtlasEntry");
    }

    delete[] memblock;
}

上記のコードは常にprintfをトリガーします。逆シリアル化できるようにファイルを正しく読み取るにはどうすればよいですか?

4

2 に答える 2

3

表示するモデルは、protobuf-netに対して、オプションのフィールド(デフォルトはゼロのいくつか)を実際に表しています。その結果、ゼロが省略される可能性があります。これにより、c ++リーダーがメッセージを拒否します(.protoが必要に応じてメッセージをリストするため)。

代表的な.protoを取得するには:

string proto = Serializer.GetProto<YourType>();

または、C#でそれらを「必須」にする場合:

[ProtoMember(3, IsRequired = true)]

(等)

于 2012-09-08T17:06:32.173 に答える
1

これを行うには十分なはずです:

TextureAtlasSettings::TextureAtlasEntry taSettings;

ifstream file("Content\\Protobuf\\TextureAtlas0.bin", ios::in | ios::binary);

if (file.is_open())
{
    if (!taSettings.ParseFromIstream(&file)) 
    {
        printf("Failed to parse TextureAtlasEntry");
    }
}
于 2012-09-08T14:33:06.730 に答える