一部のオブジェクトにXMLをデシリアライズ
-
20-09-2019 - |
質問
私は、ビジネス・オブジェクトにデシリアライズするいくつかのXMLを持っています。私はそうするXmlSerializer.Deserializeを使用しています。しかし、私はXMLに含まれているのXmlElementの一つは、XElementの滞在したい。
XElementがシリアライズないのでこれは(XmlElementAttributeを使用して)直接実行することはできません。私はまた、(2つの工程でのXElementを取得しようと)文字列にその要素をシリアル化しようとしたが、それはエラーで失敗しました。
予期しないノード型素子。 メソッドをreadelementstringにのみ可能 単純またはを持つ要素に呼びかけ 空のコンテンツ
それを行うことができますどのように任意のアイデア?
ここでは、XMLの例があり、その結果のオブジェクトは、私が欲しいます:
<Person name="Joe">
<Hobbies>
<Hobby name="Reading" .../>
<Hobby name="Photography" .../>
</Hobbies>
<HomeAddress>
...
</HomeAddress>
</Person>
オブジェクトます:
public class Person
{
[XmlAttribute("Name")]
public string Name {get; set;}
?????
public XElement Hobbies {get; set;}
[XmlElement("HomeAddress")]
public Address HomeAddress {get; set;}
}
は動作しません試みます:
[XmlElement("Hobbies")]
public XElement Hobbies {get; set;}
[XmlElement("Hobbies")]
public string Hobbies {get; set;}
解決
IXmlSerializable
のようなものを実装するためのハードワークを避けるために、あなたは半隠されたパススルーXmlElement
財産の線に沿って何かをするかもしれません。ただし、あなただけ(あなたの例のようではない2)1つのルートXElement
値を持つことができるので、これは非常にあなたがやりたいしないこと。あなたがそれを行うには、リストが必要になります...
using System;
using System.ComponentModel;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
public class Person
{
[XmlAttribute("Name")]
public string Name { get; set; }
[XmlIgnore]
public XElement Hobbies { get; set; }
[XmlElement("Hobbies")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public XmlElement HobbiesSerialized
{
get
{
XElement hobbies = Hobbies;
if(hobbies == null) return null;
XmlDocument doc = new XmlDocument();
doc.LoadXml(hobbies.ToString());
return doc.DocumentElement;
}
set
{
Hobbies = value == null ? null
: XElement.Parse(value.OuterXml);
}
}
[XmlElement("HomeAddress")]
public Address HomeAddress { get; set; }
}
public class Address { }
static class Progmam
{
static void Main()
{
var p = new Person { Hobbies = new XElement("xml", new XAttribute("hi","there")) };
var ser = new XmlSerializer(p.GetType());
ser.Serialize(Console.Out, p);
}
}
他のヒント
XMLは、あなたのクラスがSystem.Xml.Serialization.IXmlSerializableインタフェースを実装し、ReadXmlの説明とでWriteXmlをオーバーライドすることができますどのように生成されるかについて(全責任と一緒に)完全に制御を持っています。私は辞書のクラスで前にこれを行うには持っていた - 。特にnullの性質、空のフィールドなど。
で、徹底的にテストしてください