在日志文件中转储C#类

时间:2013-08-20 15:51:03

标签: c# .net debugging logging

有没有办法转储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,它是一个例子。我希望能够使用相同的转储代码来使用我的所有类

更新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 个答案:

答案 0 :(得分:1)

如果您需要这种特殊的xml格式,那么您可以通过反射轻松实现此目的。

你可以写一个类似的方法:

public string DumpClass(object obj) {}

在你的方法中,只需获取对象的类型,然后以递归方式遍历其属性。

或者您可以使用XmlSerializer,它的格式不一样,但它会将您的类序列化为非常易读的xml。 (这里有一个例子:http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm

答案 1 :(得分:0)

我建议使用XElement将此文件创建为XML,然后将字符串保存到文本文件中。只需将空字符串""放在变量对每个标记的位置。您也可以使用xml serialization并将其写入文件。

答案 2 :(得分: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();

答案 3 :(得分: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>