gpt4 book ai didi

c# - ProtoBuf-net 序列化 IEnumerable

转载 作者:太空狗 更新时间:2023-10-29 20:28:41 25 4
gpt4 key购买 nike

我正在尝试在我的项目中使用 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/

25 4 0