1

deux クラスをダンプする方法はありますか :

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 クラスです。これは例です。すべてのクラスを同じダンプ コードで使用できるようにしたい

Update 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>

ありがとう

4

4 に答える 4

1

この特定の xml フォーマットが必要な場合は、リフレクションを使用して簡単に実現できます。

次のようなメソッドを記述できます。

public string DumpClass(object obj) {}

メソッドでは、オブジェクトの型を取得してから、そのプロパティを再帰的に反復します。

または、XmlSerializer を使用することもできます。これは同じ形式ではありませんが、クラスを非常に読みやすい xml にシリアル化します。(ここに例があります: http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm )

于 2013-08-20T15:57:04.607 に答える
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();
于 2013-08-20T16:01:02.503 に答える
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>
于 2013-08-20T16:05:33.327 に答える
0

XElementを使用してこのファイルを XML として作成し、文字列をテキスト ファイルに保存することをお勧めします。""すべてのタグの変数があった場所に空の文字列を配置するだけです。xml シリアル化を使用して、ファイルに書き込むこともできます。

于 2013-08-20T15:58:57.187 に答える