ProtoBuf-net序列化IEnumerable <T>

Ale*_*sev 7 c# silverlight protobuf-net

我正在尝试在我的项目中使用ProtoBuf-NET(它主要是Silverlight 4项目).

我在序列化我的模型集合时遇到了困难,它们都是这样定义的:

private List<T> _itemsSet;
public IEnumerable<T> TSet
{
    get {return _itemsSet;}
    set {_itemsSet = value == null ? new List<T>() : new List<T>(value);}
}
public void AddT(T item)
{
    //Do my logic here
    _itemsSet.Add(item);
}
Run Code Online (Sandbox Code Playgroud)

更新:首先我不能序列化它 - No serializer defined for type: System.Collections.Generic.IEnumerable1 [MyType]`.其次,我认为我将无法根据手动和protobuf-net源代码分析来绝对它.

  1. 有没有办法扩展protobuf-net以将代理提供给ProtoMemeber属性中的外部Add方法?
  2. 为什么使用ProtoMember(1, OverwriteList=true)不起作用?它不是要覆盖收集而不应该关心Add<T>()方法吗?为什么它只是不尝试将此属性设置为T [] List<T>或任何可分配的设置IEnumerable<T>
  3. 有没有办法提供自定义反射机制来处理Silverlight中的私有字段,例如:实现:public interface IReflectable{ object GetValue(FieldInfo field); void SetValue(FieldInfo field, object value); }使用私有字段.我使用这种方法与Db4o的私有字段一起工作:http://community.versant.com/Forums/tabid/98/aft/10881/Default.aspx
  4. 除了创建继承之外,我有哪些选择MyTypeCollection<T> : Collection<T>

Mar*_*ell 5

  1. 目前没有,没有;公开的类型必须(至少)有一个Add方法。虽然我不反对调查Add对象本身的外部可能性,但这很复杂,因为您正在查看不同的“主要”对象(序列与容器)。然而; 如果您的对象实现IEnumerable<T>(返回_itemsSet.GetEnumerator()等),那么它会Add自动找到

  2. 我看不到这里的上下文;然而,我怀疑,如果没有Add它仍然是不乐意考虑名单摆在首位。不过,我明白你的做法,这也许是一种可以推理“我可以在List<T>这里使用”的方式

  3. 老实说,这不是我调查过的事情。所以不行

  4. 属性中公开的类型至少必须:实现IEnumerable(虽然IEnumerable<T>是首选),并公开一个Add(T)方法。它不必是Collection<T>//List<T>等 - 简单地说:它必须(目前)有一些机制可以添加。IList<T>将是一个务实的选择,但我认为这不是你想要的。

乔纳森是对的,外部类具有 _itemsSet,TSet和的东西AddT)的代理也可能是一种选择。

如果外部类存在集合和 add 方法,那么只需添加: IEnumerable<T>和重命名AddTAdd可能会使其工作。