Почему следующее использование protobuf-net запрещено? - PullRequest
1 голос
/ 24 мая 2011
  public interface IYObject
  {
    string X { get; }
  }

  public class YObject : IYObject
  {
    public string X { get; set; }
  }

  public class D
  {
    public IYObject Y { get; set; }
  }

  class Program
  {
    static void Main()
    {
      var m = RuntimeTypeModel.Default;
      m.Add(typeof(D), true).Add("Y");
      m.Add(typeof(IYObject), false).AddSubType(1, typeof(YObject)).Add("X");
      var d = new D { Y = new YObject { X = "a" } };
      using (var ms = new MemoryStream())
      {
        Serializer.Serialize(ms, d);
        ms.Position = 0;
        var d2 = Serializer.Deserialize<D>(ms);
        Debug.Assert(d.Y.X == d2.Y.X);
      }
    }
  }

Код не работает, когда я пытаюсь добавить подтип к IYObject:

System.InvalidOperationException occurred
  Message=Sub-types can only be adedd to non-sealed classes
  Source=protobuf-net
  StackTrace:
       at ProtoBuf.Meta.MetaType.AddSubType(Int32 fieldNumber, Type derivedType)
  InnerException: 

1 Ответ

1 голос
/ 25 мая 2011

Раньше примерно 2 минуты назад это было незаконно, потому что известные типы не поддерживались для интерфейсов.

Теперь , это использование недопустимо, поскольку не может безопасно сериализовать IYObject.X потому что не имеет установщика .Однако до тех пор, пока мы ограничиваемся членами интерфейса, которые могут быть разумно сериализованы, или членами конкретного типа, это теперь фиксируется.Используя либо атрибуты, либо модель типа. См. Здесь для сценариев, которые теперь доступны (с помощью кода или следующего публичного удаления).

...