Silverlight:DataContractSerializer无法处理只读集合属性
对于我们的Silverlight项目(SL4),我使用的模型可能包含列表(Silverlight:DataContractSerializer无法处理只读集合属性,silverlight,serialization,collections,silverlight-4.0,datacontractserializer,Silverlight,Serialization,Collections,Silverlight 4.0,Datacontractserializer,对于我们的Silverlight项目(SL4),我使用的模型可能包含列表(IListIList属性没有公共setter。我们使用正在工作的DataContractSerializer序列化模型。但是当我尝试反序列化时,DataContractSerializer的ReadObject(Stream)会引发SecurityException方法,抱怨由于缺少公共setter而无法设置目标属性(指向IList属性) 由于DataContractSerializer是密封的,既不可扩展也不灵活,因此我
IListIList
属性没有公共setter。我们使用正在工作的DataContractSerializer序列化模型。但是当我尝试反序列化时,DataContractSerializer的ReadObject(Stream)会引发SecurityException
方法,抱怨由于缺少公共setter而无法设置目标属性(指向IList
属性)
由于DataContractSerializer
是密封的,既不可扩展也不灵活,因此我目前看不到添加某种附加规则的机会,这些规则允许使用add()
方法上的foreach循环或传输集合项的其他方法来反序列化ILists
我还试着深入研究DataContractSerializer
源代码(使用Reflector)来创建一个小分支,但看起来我必须深入研究,复制整个序列化类似乎不是一个可行的解决方案
您是否看到了另一个使用DataContractSerializer
在没有公共setter的情况下序列化列表的机会
提前非常感谢您的想法
更新
使用XmlSerializer解决
Thomas使用具体(可变)类型,并为DC提供它想要的
它对我来说效果很好(我通常只在DataContractSerializable类中指定具体类型)。泛型序列化的整个方法是wash,并且附带了cavaets——选择您的方法。或者,使用另一种方法,例如ISerializable(uhg)(无法反序列化接口属性),但(反)序列化ILists项的工作非常有效
对我们来说,唯一的变化是在[xmlclude]
属性之外添加[KnownType]
(当然,将DataContractSerializer.WriteObject(…)
中的几行替换为XmlSerializer.Serialize(…)
感谢您的支持!=)谢谢!(我选择了另一种解决方案)