Нужна помощь в самом простом примере с protobuf-net 4 - PullRequest
1 голос
/ 09 июня 2011
  [DataContract]
  public class I<TId>
  {
    [DataMember(Order = 1)]
    public TId Id { get; set; }
  }

  [DataContract]
  public class J : I<int>
  {
    [DataMember(Order = 1)]
    public string Description { get; set; }
  }

  class Program
  {
    static void Main()
    {
      var o = new J { Id = 5, Description = "xa-xa", };
      using (var ms = new MemoryStream())
      {
        Serializer.Serialize(ms, o);
        ms.Position = 0;
        var o2 = Serializer.Deserialize<J>(ms);
        Debug.Assert(o.Id == o2.Id);
      }
    }
  }

Почему утверждение не выполняется и как его исправить?

Спасибо.

1 Ответ

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

Сбой, потому что protobuf-net не может обработать наследование, если вы не дадите ему больше подсказок ни через атрибуты, ни через тип-модель времени выполнения - по сути, ему нужно откуда-то получить номер поля (то есть вас). Я согласен признать, что, возможно, предупреждение о трассировке может быть полезным в этом случае, так как разумно ясно, что в этом сценарии наследования, вероятно, есть нечто большее, чем просто J.

Следующее дополнение (во время выполнения) исправляет это:

RuntimeTypeModel.Default.Add(typeof(I<int>), true).AddSubType(2, typeof(J));

(единственное значение 2 заключается в том, что он не конфликтует с любыми другими полями, определенными для I<int>).

...