2

次のように記述できる Protocol Buffers 形式のデータがあります。

message Sections {
    repeated Section sections = 1;
}

message Section {
    required uint32 type = 1;
    required bytes payload = 2;
}

message SectionType1 {
    required int32 fieldType1 = 1;
    // ...
}

message SectionType2 {
    required int32 fieldType2 = 1;
    // ...
}

message SectionType3 {
    required int32 fieldType3 = 1;
    // ...
}

protobuf-net ライブラリ (+ protogen + プリコンパイル) を使用しています。このようなデータを次のような DTO に逆シリアル化するにはどうすればよいですか

public class Sections
{
    public List<Section> Sections { get; }
}

public abstract class Section
{
}

public class SectionType1 : Section
{
    public int FieldType1 { get; }
}

public class SectionType2 : Section
{
    public int FieldType2 { get; }
}

public class SectionType3 : Section
{
    public int FieldType3 { get; }
}

.NET からそのようなデータを操作することは可能ですか (私は軽いフレームワークを使用しているため、プリコンパイルを使用します)?

4

2 に答える 2

0

調査結果を追加したかったので、1 つの基本クラスと 20 の派生クラスを持つ .proto ファイルを作成しました。protobuf-net r668\ProtoGen 経由でコードを生成しました。上記の手順に従いましたが、まだエラーが発生し、サブタイプが見つかりませんでした。

試行錯誤したところ、生成されたコードに、生成されたすべてのクラスに対して global::ProtoBuf.IExtensible があることがわかりました。これに加えて、生成されたすべてのクラス private global::ProtoBuf.IExtension extensionObject; から 3 行以下を削除しました。global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }

この後、エラーは発生しませんでした。なぜそれが助けになったのかわかりませんが、うまくいきました。

于 2014-09-13T02:39:04.377 に答える
0

それを行うには、手動で行う必要があります-つまり、

[ProtoContract]
public abstract class Section
{
    [ProtoMember(1)] public int Type {get;set;}
    [ProtoMember(2)] public byte[] Payload {get;set;}
}

残りは手動で処理します。protobuf-net 継承マップは、の.proto スキーマの最上位にマップされます。

message Section {
    optional SectionType1 Type1 = 1;
    optional SectionType2 Type2 = 2;
    optional SectionType3 Type3 = 3;
}

ここで、次のように言います。

[ProtoInclude(1, typeof(SectionType1)]
[ProtoInclude(2, typeof(SectionType2)]
[ProtoInclude(3, typeof(SectionType3)]
public abstract class Section
{
}
于 2012-11-21T13:33:20.823 に答える