2013-08-20 16 views
1

有沒有辦法轉儲德塞夫勒類:轉儲C#類

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
    public List<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public string Street { get; set; } 
    public int Number { get; set; } 
    public int Zipcode { get; set; } 
    public string Locality { get; set; } 
} 

我想有類似下面。你認爲這有可能嗎?我怎樣才能做到這一點 ? 重要的是,這裏是一個類Person,它是一個例子。我希望能夠與用戶相同的轉儲代碼

更新1 我不需要只有「結構」,但所有我的班「結構」 +數據和類不可序列

<Person> 
     <FirstName></FirstName> 
     <LastName></LastName> 
     <Age></Age> 
     <Addresses> 
      <Address> 
       <Street></Street> 
       <Number></Number> 
       <Zipcode></Zipcode> 
       <Locality></Locality> 
      </Address> 
      <Address> 
       <Street></Street> 
       <Number></Number> 
       <Zipcode></Zipcode> 
       <Locality></Locality> 
      </Address>  
     </Addresses> 
    </Person> 

感謝

+1

當然,使用反射。但是,就目前而言,您的問題似乎並未表明您已嘗試自行解決此問題,並付出了很多努力。 –

+1

這將更像[序列化XML](http://msdn.microsoft.com/en-us/library/58a18dwa.aspx) – Habib

回答

0

甩掉你的類,我認爲這將是更好的使用比實際XmlSerialization你定義了什麼。它幾乎相同,但Xml是標準的。

public void SerializeObject<T>(T obj) 
{ 
    using (StreamWriter sw = new StreamWriter("your path")) 
    { 
     new XmlSerializer(typeof(T)).Serialize(sw, obj); 
    } 
} 

public T DeserializeObject<T>() 
{ 
    T obj; 
    using (StreamReader sr = new StreamReader("your path")) 
    { 
     obj = (T)new XmlSerializer(typeof(T)).Deserialize(sr); 
    } 

    return obj; 
} 

您可以使用它像這樣:

Person p = new Person(); 
SerializeObject(p); 

這裏的輸出是什麼樣子,不修改對您的Person類製造(不需要任何[Serializable接口]標籤):

<?xml version="1.0" encoding="utf-8"?> 
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <FirstName>f</FirstName> 
    <LastName>l</LastName> 
    <Age>50</Age> 
    <Addresses> 
    <Address> 
     <Street>s</Street> 
     <Number>1</Number> 
     <Zipcode>1</Zipcode> 
     <Locality>l</Locality> 
    </Address> 
    <Address> 
     <Street>s2</Street> 
     <Number>12</Number> 
     <Zipcode>12</Zipcode> 
     <Locality>l2</Locality> 
    </Address> 
    </Addresses> 
</Person> 
+0

查看更新1 –

+0

@ Kris-I你是什麼意思「這些類是不可序列化「?它們由int和字符串組成,當然它們是。你甚至不需要將它們標記爲[Serializable()] –

1

如果你需要這種特殊的XML格式,那麼你可以很容易地與反射實現這一目標。

你可以寫一個方法看起來像:

public string DumpClass(object obj) {} 

,並在你的方法,只是讓你的對象的類型,然後通過其屬性遞歸迭代。或者您可以使用XmlSerializer,它不會是相同的格式,但它會將您的類序列化爲非常易讀的xml。 (你在這裏有一個例子:http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm

0

我建議使用XElement來創建這個文件作爲XML,但只是將字符串保存到文本文件。只需將空字符串""代替每個標籤變量的位置。您也可以使用xml serialization並將其寫入文件。

0

試試這個:

[Serializable()] 
[XmlRoot("Person")] 
public class Person 
{ 
    XmlElement("FirstName")] 
    public string FirstName { get; set; } 

    XmlElement("LastName")] 
    public string LastName { get; set; } 

    XmlElement("Age")] 
    public int Age { get; set; } 

    [XmlArray("Addresses")] 
    [XmlArrayItem("Address", typeof(Address))] 
    public List<Address> Addresses { get; set; } 
} 

[Serializable()] 
public class Address 
{ 
    [XmlElement("Street")] 
    public string Street { get; set; } 

    [XmlElement("Number")] 
    public int Number { get; set; } 

    [XmlElement("Zipcode")] 
    public int Zipcode { get; set; } 

    [XmlElement("Locality")] 
    public string Locality { get; set; } 
} 

序列化:

Person person = new Person(); 
XmlSerializer serializer = new XmlSerializer(typeof(Person)); 

StreamWriter writer = new StreamWriter(file_path); 
serializer.Serialize(writer, person); 
writer.Close(); 

反序列化:

XmlSerializer serializer = new XmlSerializer(typeof(Person)); 

StreamReader reader = new StreamReader(file_path); 
Person person = (Person)serializer.Deserialize(reader); 
reader.Close();