在日志文件中转储C#类

本文关键字:转储 日志 文件 | 更新日期: 2023-09-27 18:28:19

有没有办法转储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>

感谢

在日志文件中转储C#类

如果您需要这种特殊的xml格式,那么您可以很容易地通过反射来实现这一点。

你可以写一个方法看起来像:

public string DumpClass(object obj) {}

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

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

要转储类,我认为使用真正的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>

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

试试这个:

[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();