Исключение броска protobuf-net для базового класса - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть следующее ..

[ProtoContract, ProtoInclude(50, typeof(DateRange)), ProtoInclude(51, typeof(IntRange))]
public class Range<T> : IEquatable<Range<T>>, IEquatable<OpenRange<T>> where T: struct, IComparable<T>
{
   [ProtoMember(1)]
   public T Start { get; set; }
   [ProtoMember(2)]
   public T End { get; set; }
}

[ProtoContract]
public class DateRange : Range<DateTime>
{
}

[ProtoContract]
public class IntRange : Range<int>
{
}

Когда я пытаюсь сериализовать DateRange, я получаю следующую ошибку ..

ProtoBuf.ProtoException: тип может участвовать только в одной иерархии наследования (DateRange) ----> System.InvalidOperationException: тип может участвовать только в одной иерархии наследования

Проведя некоторое время в исходном коде, я почти уверен, что проблема в том, что у DateRange и IntRange технически есть разные родительские элементы, поскольку Range ! = Range . Так что на самом деле я не уверен, как мы собираемся обращаться с дженериками.

1 Ответ

1 голос
/ 12 сентября 2011

В итоге взяли подробности из вопроса, с которым связался Марк, и создали это:

RuntimeTypeModel.Default[typeof (Range<DateTime>)]
   .AddSubType(50, typeof (DateRange));
RuntimeTypeModel.Default[typeof(Range<int>)]
   .AddSubType(50, typeof(IntRange));

Вид боли, но, по крайней мере, это работает!

...