我有一个非常具体的反序列化需求,请参见下面的示例:
说我有以下课程:
[Serializable]
public class Person {
public string Name { get; set; }
public string PersonXml { get; set; }
}
并遵循XML
<Person> <Name>John</Name> <PersonXml><someXmlFragment>text</someXmlFragment></PersonXml> </Person>
我想要的是XmlSerializer类来反序列化&lt; PersonXml&gt;的InnerXml。 PersonXml属性的元素作为字符串。 我想知道是否可以做到。
注意: 我知道我可以编码&lt; PersonXml&gt;的内容逃避非法的XML字符,但我更希望让内部XML更加人性化(不包含&amp; lt;以及其他只会影响我最终用户的实体)
答案 0 :(得分:3)
您可以随时实施IXmlSerializable
,并通过XmlReader
做任何您喜欢的事情。
答案 1 :(得分:1)
因此,即使元素实际上包含XML元素,您还希望.NET假装它真的是一个字符串吗?我认为这不可能通过标准序列化。
但是,您可以加载XML,转换PersonXml并正确转义它,然后用新转换的数据替换PersonXml的内容。它将涉及在反序列化之前手动操作XML,但是然后您可以将XML元素保留在PersonXml下。
答案 2 :(得分:1)
我在寻找类似的解决方案时难以理解这个答案。不想使用IXmlSerializable。
因此,如果有人在将来查看此问题,可以使用XmlAnyElement
属性将内部xml序列化为XmlNode。然后,您可以根据需要对XmlNode进行处理,单独运行序列化或根据需要获取xml的文本。
对于这个例子:
public class Person
{
public string Name { get; set; }
[XmlAnyElement]
public XmlNode PersonXml { get; set; }
}
答案 3 :(得分:0)
为什么不使用XML来表示XML?只需将XmlElement
用于PersonXml
。
假装XML与String相同,这总是一个坏主意。
答案 4 :(得分:0)
这篇文章很老了,但是我正在寻找解决方案,也许我的回答可以帮助别人。
怎么样?
[XmlText]
public string PersonXml { get; set; }
这不会解决您的问题,但可能是一种可接受的选择。
在我的情况下,PersonXml是一个“很好的元素”,并不总是包含Xml。当PersonXml包含Xml时,[XmlText]会导致PersonXml为null。但是,当PersonXml包含没有Xml的文本时,反序列化是正确的。
在没有[XmlText]的情况下,PersonXml中的Xml导致PersonXml之前的元素被正确反序列化,但PersonXml之后的元素被错误地反序列化。