2009-12-10 8 views
5

私は変更することはできませんXMLを与えていると私はカスタムクラスにそれをデシリアライズする必要があります。複数のネストされたアイテムでXMLを逆シリアル化する方法

<Person> 
    <Addresses> 
     <MainAddress> 
      <Country /> 
      <City /> 
     </MainAddress> 
     <AdditionalAddress> 
      <Country /> 
      <City /> 
     </AdditionalAddress> 
     <AdditionalAddress> 
      <Country /> 
      <City /> 
     </AdditionalAddress> 
     ... other additional addresses 
    </Addresses> 
    ... other elements 
</Person> 

は、その後、私はデシリアライズ:

XmlSerializer serializer = new XmlSerializer(typeof(Person), namespace); 
Person person = serializer.Deserialize(stream) as Person;  

デシリアライザ単純な要素が直列化復元されている場合には正常に動作します。 アドレスのような要素があった場合、私はここのようにそのクラスにIXmlSerializableを実装:link text

問題はreader.ReadElementContentAsString()は複雑な要素で使用することができないということです。

答えて

3

Adressessクラスは、このように宣言する必要があります。

[XmlRoot("Adressess")] 
public class Adressess 
{ 
    [XmlElement(ElementName = "MainAddress")] 
    public MainAddress Main { get; set; } 

    [XmlElement(ElementName = "AdditionalAddress")] 
    public List<AdditionalAddress> AdditionalAddresses { get; set; } 
} 

[XmlRoot("MainAddress")] 
public class MainAddress 
{ 
    public string Country { get; set; } 
    public string City { get; set; } 
} 

[XmlRoot("AdditionalAddress")] 
public class AdditionalAddress 
{ 
    public string Country { get; set; } 
    public string City { get; set; } 
} 
+0

注MainAddressプロパティは、MainAddressStoreクラスなどで実装できます(プロパティと型の共有名を持つのが混乱することがあります)。もちろん、このようなスケルトンクラスではあまり重要ではありませんが、その目的はシリアル化のサポートだけです。 –

+0

クラス名と異なるプロパティ名を編集しました。別のMainAddressクラスとAdditionalAddressクラスが本当に必要かどうかは分かりません。私はそれらに異なるXmlRootの名前で声明を出したかった。 – PanJanek

+0

私は動作しません。 MainAddressには値が設定されていますが、AdditionalAddressは設定されていません。 – jlp

0

また、ルート・オブジェクト・タイプは、名前空間を持っている場合、ネストした型に対して同じ名前空間を使用する必要があります。

例:タイプ名がそう例えば、関連性がないこと

[System.Xml.Serialization.XmlRootAttribute(Namespace = "some namespace")] 
class Person {...} 

[System.Xml.Serialization.XmlRootAttribute(Namespace = "some namespace")] 
class MainAddress{...} 
関連する問題