Как сериализовать коллекцию List <T>в protobuf-net - PullRequest
2 голосов
/ 13 июня 2011

Соблюдайте следующий код:

[ProtoContract]
public class C
{
  [ProtoMember(1)]
  public IList<string> Tags { get; set; }
}

class Program
{
  static void Main()
  {
    var m = RuntimeTypeModel.Default;
    m.AutoCompile = true;
    m.Add(typeof(IList<string>), false).AddSubType(1, typeof(ObservableCollection<int>));

    var c = new C { Tags = new ObservableCollection<string> { "hello" } };
    using (var ms = new MemoryStream())
    {
      Serializer.Serialize(ms, c);
      ms.Position = 0;
      var c2 = Serializer.Deserialize<C>(ms);
      Debug.Assert(c.Tags.Count == c2.Tags.Count);
      Debug.Assert(c.Tags.GetType() == c2.Tags.GetType());
    }
  }
}

Последнее утверждение не выполняется, поскольку c2.Tags - это обычный List<T>, а не ObservableCollection<T>. По сути, оператор AddSubType игнорируется.

Можно ли это исправить без использования суррогатов?

1 Ответ

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

Списки и т. Д. Сопоставляются с «повторным» синтаксисом из спецификации .proto. Это встраивается непосредственно из родительского объекта напрямую. Нет возможности хранить какие-либо дополнительные метаданные.

Код был изменен, чтобы выделить это, а не игнорировать.

Вы можете указать используемый тип бетона по умолчанию, но только этот.

...