Развернуть сообщение protobuf с помощью подкласса - PullRequest
1 голос
/ 27 июня 2011

У меня есть два класса, которые я хотел бы преобразовать в сообщения protobuf:

[ProtoContract]
class ClassA {
    [ProtoMember(1)]
    public int b;
    [ProtoMember(2)]
    public int c;
}

[ProtoContract]
class ClassD : ClassA
{
    [ProtoMember(3)]
    public int e;
    [ProtoMember(4)]
    public int f;
}

Я пытаюсь добиться сериализации ClassA, содержащей b и c.И при сериализации ClassD я получу b, c, e и f.

Возможно ли это, или какой подход я должен использовать?Я пытаюсь избежать вложенных сообщений.

Используя мой подход, я получаю проблему при сериализации объекта ClassD.

ClassD d = new ClassD();
Serialize.Serialize<ClassA>(stream, d);
Serialize.Serialize<ClassD>(stream, d);

В обеих попытках выше сериализованные данные содержат только свойства в ClassDи ни один из ClassA.Я ожидаю, что по крайней мере ни одно из свойств в ClassD не будет сериализовано в первом случае, и я хотел бы, чтобы все, как из ClassA, так и ClassD, были сериализованы во втором случае.

Как бы я подошел к этой проблеме?

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Похоже, что это работает в v2 без наследования:

    var model = TypeModel.Create();
    model.Add(typeof(ClassA), false).Add("b", "c");
    model.Add(typeof(ClassD), false).Add("b", "c", "e", "f");

    var a = new ClassA { b = 1, c = 2 };
    var aClone = (ClassA)model.DeepClone(a);
    Debug.Assert(aClone.b == 1);
    Debug.Assert(aClone.c == 2);

    var d = new ClassD { b = 1, c = 2, e = 3, f = 4};
    var dClone = (ClassD)model.DeepClone(d);
    Debug.Assert(dClone.b == 1);
    Debug.Assert(dClone.c == 2);
    Debug.Assert(dClone.e == 3);
    Debug.Assert(dClone.f == 4);

Каждая из них будет плоской моделью, а не вложенной.На данный момент это потребует явной настройки (как указано выше), так как это не является частью того, как она строит модель по умолчанию - но в качестве следствия вам здесь не нужны атрибуты:

class ClassA
{
    public int b;
    public int c;
}
class ClassD : ClassA
{
    public int e;
    public int f;
}
1 голос
/ 27 июня 2011

Sure:

[ProtoContract, ProtoInclude(3, typeof(ClassD))]
class ClassA {...}

"3" может быть чем угодно, если только оно не конфликтует с чем-либо еще из ClassA.

Это будет появляться в виде вложенного сообщения в сети, но автоматически. Если это явно не , что вы хотите, то дайте мне знать.

...