防止IEnumerable和ICollection <T>和继承的类型的XML序列化
注意:XMLIgnore不是答案!
好的,所以从我关于XML序列化和继承类型的问题开始,我开始将该代码集成到我正在处理的应用程序中,愚蠢地认为一切都会顺利进行。
我遇到了几个实现IEnumerable和ICollection <T>的类的问题
这些问题是,当XMLSerializer来序列化这些属性时,它会将它们视为一个外部属性,而不是使用我们希望它使用的属性(即具有AbstractXmlSerializer的属性),它就落在这里了(由于类型不匹配),这几乎使我们回到了平方。我们也不能使用XmlIgnore属性来修饰这些方法,因此我们不能以这种方式停止它。
我当前的解决方案是删除接口实现(在此当前应用程序中,它没什么大不了的,只是使代码更漂亮)。
我需要在这件事上大放异彩并接受它无法完成吗?我知道我已经推动了XmlSerializer的发展,并且超出了预期:)
编辑
我还应该补充一点,我目前正在框架2中工作。
更新
我接受了lomaxx的回答。在我的情况下,我实际上不能执行此操作,但是我知道它会起作用。由于没有其他建议,因此我最终从代码中删除了接口实现。
解决方案
回答
我们可以通过抓住System.RunTime.Serialization dll(它是.net 3.x程序集)并从.net 2.0应用程序中引用它来解决此问题。这是可行的,因为.net 3.0二进制文件已编译为可以在.net 2.0 CLR上运行。
这样,我们就可以访问DataContractSerliazer,它用于解决类似的问题,我想将ICollection作为参数传递给Web服务,而xmlserializer不知道如何正确处理它。
如果我们对在2.x应用程序中使用.net 3.x dll感到很满意,则应该可以使用DataContractSerializer解决此问题
回答
如果使用以下属性:
[XmlArray("ProviderPatientLists")] [XmlArrayItem("File")] public ProviderPatientList Files { get { return _ProviderPatientLists; } set { _ProviderPatientLists = value; } }
ProviderPatientList继承的List <PatientList>
然后,我们可以更好地控制输出的xml
将创建
回答
我猜答案来不及了,无法对特定应用程序有用,但是也许其他人也遇到同样的问题。
我想我们可以为IEnumerable类型实现IXmlSerializable来解决此问题。但是,这意味着我们必须完全控制此类型的序列化过程。一种无需麻烦XmlReader / XmlWriter的简单方法,我们可以编写一个带有公共ctor和所有要序列化数据的public读写属性的helper xml适配器类,并在其中为该类型创建一个临时XmlSerializer对象IXmlSerializable。[读取|写入] Xml()。
class Target : IEnumerable<Anything>, IXmlSerializable { //... public void ReadXml(System.Xml.XmlReader reader) { reader.ReadStartElement(); TargetXmlAdapter toRead = (TargetXmlAdapter)new XmlSerializer(typeof(TargetXmlAdapter)).Deserialize(reader); reader.Read(); // here: install state from TargetXmlAdapter } public void WriteXml(System.Xml.XmlWriter writer) { // NOTE: TargetXmlAdapter(Target) is supposed to store this' state being subject to serialization new XmlSerializer(typeof(TargetXmlAdapter)).Serialize(writer, new TargetXmlAdapter(this)); } }