对于我们的Silverlight项目(SL4),我使用的模型可能包含列表(IList<AnotherModel>
)。根据良好做法和规则CA2227:CollectionPropertiesShouldBeReadOnly
,IList
属性没有公共设置者。我们使用正在运行的DataContractSerializer序列化Model。但是当我尝试反序列化时,DataContractSerializer的ReadObject(Stream)
方法抛出了SecurityException,抱怨由于缺少公共setter而无法设置目标属性(指向IList
属性)。
由于DataContractSerializer
是密封的,既不可扩展也不灵活,所以我目前看不到添加某些额外的规则,允许使用{{1}上的foreach循环反序列化ILists
方法或其他一些传输集合项的方法。
我也试图深入研究Add()
源代码(使用Reflector)来创建一个小分叉,但看起来我必须深入挖掘并复制整个序列化类似乎不是一个可行的解决方案。
您是否还看到使用DataContractSerializer
序列化没有公开制定者的列表的机会?
非常感谢你的想法!
更新
使用XmlSerializer解决。
托马斯
答案 0 :(得分:1)
使用具体(可变)类型并为DCS提供它想要的东西。
它适用于我(我通常只指定DataContractSerializable类中的具体类型)。通用序列化的整个方法是洗涤,并附带cavaets - 选择你的战斗。或者,使用另一种方法,例如ISerializable(uhg)。
答案 1 :(得分:1)
在我们的案例中,我们发现我们并没有严格限制DataContractSerializer
,有趣的是,XmlSerializer
支持只读IList序列化!实际上,在这种情况下,它甚至不允许 IList接口的公共setter(不能反序列化接口属性),但是(de-)序列化ILists项就像魅力一样。
除了[XmlInclude]
之外,我们只更改[KnownType]
属性(当然,将DataContractSerializer.WriteObject(...)
中的几行替换为XmlSerializer.Serialize(...)
。
感谢您的支持! =)