ProtoBuf-net序列化IEnumerable
我正在尝试在我的项目中使用ProtoBuf-NET(它主要是Silverlight 4项目)。
我在序列化我的模型集合时遇到了困难,它们都是这样定义的:
private List _itemsSet; public IEnumerable TSet { get {return _itemsSet;} set {_itemsSet = value == null ? new List() : new List(value);} } public void AddT(T item) { //Do my logic here _itemsSet.Add(item); }
更新:首先我不能序列化它 – No serializer defined for type: System.Collections.Generic.IEnumerable
1 [MyType]`。 其次,我想我将无法根据手动和protobuf-net源代码分析来绝对它。
- 有没有办法扩展protobuf-net以将代理提供给ProtoMemeber属性中的外部Add方法?
- 为什么使用
ProtoMember(1, OverwriteList=true)
不起作用? 它不是要覆盖集合而不应该关心Add()
方法吗? 为什么它只是不尝试将此属性设置为T []或List
或任何可分配给IEnumerable
集合? - 有没有办法提供自定义reflection机制来处理Silverlight中的私有字段,如:implementation:
public interface IReflectable{ object GetValue(FieldInfo field); void SetValue(FieldInfo field, object value); }
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 - 除了创建inheritance的
MyTypeCollection : Collection
之外,我有哪些选项MyTypeCollection : Collection
?
-
不是现在,不是; 暴露的类型必须 (至少)具有
Add
方法。 虽然我不反对调查在对象本身之外Add
的可能性,但这很复杂,因为您正在查看不同的“主要”对象(序列与容器)。 然而; 如果您的父对象实现了IEnumerable
(返回_itemsSet.GetEnumerator()
等),那么它会自动找到Add
-
我看不到这里的背景; 但是,我怀疑没有
Add
它仍然不乐意将其视为一个列表。 不过,我看到了你的方式,也许这可能是“我可以在这里使用List
”的理由 -
说实话,这不是我调查过的; 所以不行
-
属性中公开的类型必须至少:实现
IEnumerable
(尽管IEnumerable
是首选),并公开Add(T)
方法。 它不一定是Collection
/List
/ etc – 简单地说:它必须(目前)有一些机制可以添加。IList
将是一个实用的选择,但我认为这不是你想要的。
Jonathan是对的, 外层的代理人( 有 _itemsSet
, TSet
和AddT
)也可能是一个选择。
如果外部类只存在集合和add方法,那么只需添加: IEnumerable
并将AddT
重命名为Add
可能会使它工作。
我试图偷工减料,并重新使用我的模型作为消息合同,但这实际上是错误的方法。 要做的就是为你的模型创建DTO的专用类和转换器,无论如何,将模型与消息分开是件好事。
我必须批评Marc,因为它添加了ProtoContract和ProtoMemeber属性,引诱用户通过归因来重用他们的模型。
上述就是C#学习教程:ProtoBuf-net序列化IEnumerable分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/962740.html