【问题标题】:Dump C# class in log file [closed]在日志文件中转储 C# 类 [关闭]
【发布时间】:2013-08-22 18:30:20
【问题描述】:

有没有办法转储 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# .net debugging logging


【解决方案1】:

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

您可以编写如下所示的方法:

public string DumpClass(object obj) {}

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @Kris-I “类不可序列化”是什么意思?它们是由 int 和 strings 组成的,当然它们是。您甚至不需要将它们标记为 [Serializable()]
    【解决方案3】:

    试试这个:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 2018-10-23
        相关资源
        最近更新 更多