1

对于我们的 Silverlight 项目 (SL4),我使用了一个可能包含列表 ( IList<AnotherModel>) 的模型。根据良好实践和规则CA2227:CollectionPropertiesShouldBeReadOnly 属性没有IList公共设置器。我们使用正在工作的 DataContractSerializer 序列化模型。但是当我尝试反序列化时,DataContractSerializer 的方法抛出了一个 SecurityException ,抱怨由于缺少公共设置器而无法设置ReadObject(Stream)目标属性(指向该属性)。IList

由于它DataContractSerializer是密封的,既不可扩展也不灵活,所以我目前认为没有机会添加某种额外的规则,这些规则允许反序列化ILists使用 foreach-loop onAdd()方法或其他一些传输集合项的方法。

我还尝试深入DataContractSerializer研究源代码(使用 Reflector)来创建一个小分支,但看起来我必须深入挖掘,并且复制整个序列化类似乎不是一个可行的解决方案。

您是否看到另一个使用 序列化没有公共设置器的列表的机会DataContractSerializer

非常感谢您的想法!


更新
使用 XmlSerializer 解决。


托马斯

4

2 回答 2

1

使用具体(可变)类型并为 DCS 提供它想要的东西。

它对我很有效(我通常在 DataContractSerializable 类中指定具体类型)。通用序列化的整个方法是一种清洗并附带警告——选择你的战斗。或者,使用另一种方法,例如 ISerializable (uhg)。

于 2010-05-07T08:43:23.540 回答
1

在我们的例子中,我们发现我们并没有严格绑定到DataContractSerializer,有趣的是,XmlSerializer DOES 支持只读 IList 的序列化!事实上,在这种情况下,它甚至不允许IList 接口的公共设置器(无法反序列化接口属性),但是(反)序列化 IList 项目就像一个魅力。

对我们来说唯一的改变是[XmlInclude]除了添加属性[KnownType](当然,将几行从DataContractSerializer.WriteObject(...)to替换为XmlSerializer.Serialize(...).

谢谢你的支持!=)

于 2010-05-10T12:32:58.133 回答