当前位置: 首页 > 编程语言 > C#

使用XML反序列化器无法将XML反序列化为列表分享

时间:2023-04-11 12:16:23 C#

使用XML反序列化器接口无法将XML反序列化为列表}公共字符串名称{得到;放;}[XmlIgnore]publicListMeters{get;放;}[XmlArrayItem(ElementName="Meter")][XmlArray(ElementName="Meters")]publicListSerializableMeters{get{returnMeters.Cast().ToList();}set{Meters=newList(value);}}}publicinterfaceIMeter{intMeterID{get;放;}}publicclassMeter:IMeter{publicintMeterID{get;放;}publicstringSerialNumber{get;放;我正在使用下面的扩展方法将XML反序列化回我的对象??(理想情况下我更喜欢扩展方法来离开对象,但我对扩展方法不太满意所以我现在就这样离开)...publicstaticclassSerializationExtensions{publicstaticTLoadFromXML(thisstringxmlString){TreturnValue=default(T);XmlSerializerserial=newXmlSerializer(typeof(T));StringReaderreader=newStringReader(xmlString);对象结果=串行。反序列化(读者);如果(结果!=空&&结果是T){returnValue=((T)result);}reader.Close();返回返回值;}....但是当我在下面给出XML时...RedRoute1123452SE没有电表?有谁知道可能导致此问题的原因是什么?XML是有效的,SerializeableMeters只是一个读写Meter的属性,但由于在序列化中使用接口的已知问题,将其转换为具体类问题是XmlSerializer以下列方式反序列化实现IList的引用的一个属性类:如果为null,它会调用getter来获取列表,它会分配一个列表并通过setter对其进行设置。它在读取时保存在一些局部变量的列表中。它反序列化每个列表元素并将其添加到它持有的列表中。就是这样。之后它永远不会调用包含类的列表属性设置器。您可以通过将List替换为ObservableCollection来验证这一点,并在集合更改时设置调试侦听器:[XmlArrayItem(ElementName="Meter")][XmlArray(ElementName="Meters")]WriteLine("返回代理SerializableMeters");varlist=newObservableCollection(Meters.Cast());list.CollectionChanged+=newSystem.Collections.Specialized.NotifyCollectionChangedEventHandler(list_CollectionChanged);返回列表;}set{Debug.WriteLine("设置代理SerializableMeters");Meters=newList(value.Cast());}}staticvoidlist_CollectionChanged(objectsender,System.Collections.Specialized.NotifyCollectionChangedEventArgse){varcollection=(IList)sender;Debug.WriteLine("Proxycollectionchangedtoinclude:");foreach(varitemincollection)Debug.WriteLine(""+item.ToString());这样做,您将看到以下调试输出:ReturningproxySerializableMetersReturningproxySerializableMetersSerializableMetersProxycollectionchangedtoinclude:Meter:1,12345Proxycollectionchangedtoinclude:Meter:1,12345Meter:2,SE如您所见,该列表永远不会撤回幸运的是,有一个简单的选项。如果您返回代理数组而不是代理列表,XmlSerializer将分配数组本身,填充它,并通过setter设置它——这正是您想要的![XmlArrayItem(ElementName="Meter")][XmlArray(ElementName="Meters")]publicMeter[]SerializableMeters{get{returnMeters.Cast().ToArray();}set{Meters=newList(value.Cast());}}那么以上就是C#学习教程:不能使用XML反序列化器将XML反序列化成一个列表来共享所有的内容。如果对大家有用,需要进一步了解C#学习教程,希望请关注——varmeters=xml.LoadFromXML();Debug.Assert(meters.Meters.Count==2);//没有断言。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢