代码之家  ›  专栏  ›  技术社区  ›  thmshd

Silverlight:DataContractSerializer无法处理只读集合属性

  •  1
  • thmshd  · 技术社区  · 15 年前

    对于我们的Silverlight项目(SL4),我使用的模型可能包含列表( IList<AnotherModel> )。根据良好惯例和规则 CA2227:CollectionPropertiesShouldBeReadOnly 这个 IList 属性没有公共设置程序。我们使用正在工作的DataContractSerializer序列化模型。但当我尝试反序列化时,DataContractSerializer的 ReadObject(Stream) 方法,抱怨目标属性(指向 伊利斯特 属性)无法设置,因为缺少公共设置程序。

    自从 DataContractSerializer 是密封的,既不可扩展也不灵活,因此我目前没有机会添加某种允许反序列化 ILists 在上使用foreach循环 Add() 方法或其他传递集合项的方法。

    我也试着去挖掘 数据合同序列化程序 source(使用reflector)创建一个小fork,但看起来我必须深入研究,复制整个序列化类似乎不是一个可行的解决方案。

    您是否看到了另一个在没有公共setter的情况下使用 数据合同序列化程序 ?

    非常感谢您的想法!


    更新
    使用XmlSerializer解决。


    托马斯

    2 回复  |  直到 15 年前
        1
  •  1
  •   user166390    15 年前

    使用具体的(可变的)类型并给dc它想要的。

    它对我很有效(我通常 只有 在DataContractSerializable类中指定具体类型)。泛型序列化的整个方法是wash,并附带cavaets——选择您的战斗。或者,使用另一种方法,如ISerializable(UHG)。

        2
  •  1
  •   thmshd    15 年前

    在我们的案例中,我们发现我们没有严格遵守 DataContractSerializer 有趣的是, XmlSerializer 支持 只读IList的序列化!事实上,甚至 不允许 在这种情况下,IList接口的公共setter(无法反序列化接口属性),但是(反)序列化ILists项的工作方式很有魅力。

    我们唯一的改变就是 [XmlInclude] 除了 [KnownType] (当然,还替换了 DataContractSerializer.WriteObject(...) XmlSerializer.Serialize(...)

    谢谢你的支持!=)