Как сериализовать иерархию с абстрактными классами, используя protobuf - PullRequest
2 голосов
/ 16 января 2012

У меня возникли некоторые проблемы при попытке сериализации иерархии классов с использованием protobuf. Свойства, не реализованные классами, которые наследуются от абстрактного класса, не получают правильные значения. Например, когда я пытаюсь проверить следующую иерархию ...:

[ProtoContract]
[ProtoInclude(11, typeof(Child))]
[ProtoInclude(12, typeof(Nanny))]
public abstract class Person
{
    [ProtoMember(1)]
    public string Name { get; set; }
}

[ProtoContract]
public class Child : Person
{
    public Child(){ }
}

[ProtoContract]
public class Nanny : Person
{
    public Nanny()
    {
        Tutors = new List<ITutor<Person, Person>>();
    }

    [ProtoMember(1)]
    public List<ITutor<Person, Person>> Tutors { get; set; }
}

[ProtoContract]
[ProtoInclude(11, typeof(NannyTutorChild))]
public interface ITutor<out T, out U>
    where T : Person
    where U : Person
{
    [ProtoMember(1, AsReference = true, DynamicType = true)]
    T TutoredBy { get; }

    [ProtoMember(2, AsReference = true, DynamicType = true)]
    U Tutored { get; }
}

[ProtoContract]
public abstract class Tutor<T, U> : ITutor<T, U>
    where T : Person
    where U : Person
{
    [ProtoMember(1, AsReference = true, DynamicType = true)]
    public T TutoredBy { get; set; }

    [ProtoMember(2, AsReference = true, DynamicType = true)]
    public U Tutored { get; set; }
}

[ProtoContract]
public abstract class NannyTutor<U> : Tutor<Nanny, U>
    where U : Person
{
}

[ProtoContract]
public class NannyTutorChild : NannyTutor<Child>
{
}

все десериализованные экземпляры NannyTutorChild установлены в null, даже если они правильно оценены до вызова Serializer.DeepClone (). Единственный способ заставить его работать, это пометить как абстрактные свойства в классе Tutor и реализовать их в NannyTutorChild.

Я знаю, что это может выглядеть глупо как иерархия, но в нашем реальном проекте у нас есть много разных классов, производных от нашего класса 'Tutor', и все уровни необходимы для того, чтобы типизировать или использовать правильные методы:)

Есть идеи? Я что-то не так делаю?

Спасибо всем, Mat.

1 Ответ

2 голосов
/ 16 января 2012

Этот сценарий в настоящее время не поддерживается; в комбинации DynamicType и наследовании есть сложность, с которой мне еще нужно разобраться; Я подниму его вперед в очереди ожидающих работ, но: сегодня его там нет.

...