带有C#信封的对象的XML序列化
发布时间:2020-12-15 17:13:28 所属栏目:百科 来源:网络整理
导读:我需要在C#中将对象序列化为 XML.物体应包裹在信封中.为此,我创建了以下Envelope类: [XmlInclude(typeof(Person))]public class Envelope{ public string SomeValue { get; set; } public object WrappedObject { get; set; }} 我使用以下代码序列化类: st
我需要在C#中将对象序列化为
XML.物体应包裹在信封中.为此,我创建了以下Envelope类:
[XmlInclude(typeof(Person))] public class Envelope { public string SomeValue { get; set; } public object WrappedObject { get; set; } } 我使用以下代码序列化类: string fileName = ...; XmlSerializer serializer = new XmlSerializer(typeof(Envelope)); TextWriter textWriter = new StreamWriter(fileName); try { serializer.Serialize(textWriter,<instance of envelope>); } finally { textWriter.Close(); } 当我将一个Person类型的对象分配给WrappedObject时,我得到以下XML: <Envelope> <SomeValue>...</SomeValue> <WrappedObject xsi:type="Person"> .... </WrappedObject> </Envelope> 问题是,我希望包装对象的标签以我传入的实际类命名.例如,如果我将Person的实例分配给WrappedObject,我希望XML看起来如下所示: <Envelope> <SomeValue>...</SomeValue> <Person> .... </Person> </Envelope> 如果我指定一个动物实例,我想得到 <Envelope> <SomeValue>...</SomeValue> <Animal> .... </Animal> </Envelope> 我怎么做到这一点? 编辑 实际上我已经简化了我的例子……被包裹的对象实际上又被包裹了: public class Envelope { public string SomeValue { get; set; } public Wrapper Wrap { get; set; } } [XmlInclude(typeof(Person))] public class Wrapper { public object WrappedObject { get; set; } } 如何使用属性覆盖来处理此问题? 解决方法
你需要使用
attribute override.我正在大量使用它,因为我做了很多自定义序列化.
这是一个粗略的未经测试的片段,但应指向正确的方向: XmlAttributes attributes = new XmlAttributes(); XmlAttributeOverrides xmlAttributeOverrides = new XmlAttributeOverrides(); attributes.XmlElements.Add(new XmlElementAttribute("Person",t)); xmlAttributeOverrides.Add(typeof(Person),"WrappedObject",attributes); XmlSerializer myserialiser = new XmlSerializer(typeof(Envelope),xmlAttributeOverrides); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |