c# - ProtoBuf-net 序列化 IEnumerable<T>

标签 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);
}

更新:首先我无法序列化它 - No serializer defined for type: System.Collections.Generic.IEnumerable 1[我的类型]`。其次,我认为我将无法根据手动和 protobuf-net 源代码分析对其进行反序列化。

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

最佳答案

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

  2. 我看不到这里的上下文;但是,我怀疑没有 Add 一开始仍然不乐意将其视为列表。不过,我明白你的处理方式,这也许是一种可以推理“我可以在这里使用 List<T>”的方式)

  3. 老实说,这不是我调查过的东西;所以:没有

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

Jonathan 是对的,外部类 的替代品( _itemsSetTSetAddT )也可能是一种选择.

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

关于c# - ProtoBuf-net 序列化 IEnumerable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7793527/

相关文章:

c# - 如何简化我的代码?

protobuf-net - 如何指定不序列化的默认值

c# - 使用 protobuf 为 c# 反序列化 "long"字符串对我来说不能正常工作

c# - 在链式构造函数中设置只读字段

c# - 在Python中动态进行多处理

c# - 使 NSwag 生成的客户端中的属性可为空

c# - C# Virtual 和 Override 的内部工作原理

.net - 从 Internet Explorer 访问硬件

c# - 如何序列化包含私有(private)成员的类的实例?

c# - 如何使用 Protocol Buffer 的扩展来维护 'general' 消息