C# C序列化-具有其他类列表的类

C# C序列化-具有其他类列表的类,c#,serialization,C#,Serialization,我对序列化有一些问题。假设我有这样的课: Class Hardware { public string cpu_name; public int ram_size; List<HardDisk> hd; Class HardDisk{ public string model; public int size;} } 获得结果的最简单方法是: <HardwareInfo> <cpu_name> ABC Pentium xyz</cpu_name>

我对序列化有一些问题。假设我有这样的课:

Class Hardware
{
public string cpu_name;
public int ram_size;
List<HardDisk> hd;
Class HardDisk{ public string model; public int size;}
}
获得结果的最简单方法是:

<HardwareInfo>
<cpu_name> ABC Pentium xyz</cpu_name>
<ram_size> 123 </ram_size>
<hard_disk> 
<model>Toshiba XYZ</model>
<size> 123 GB </size>
</hard_disk>
<hard_disk> 
<model>Logitech XYZ</model>
<size> 99 GB </size>
</hard_disk>
</HardwareInfo>
我已经生成了我自己的metod,只是为了添加标记,看起来我已经编写了,但是如果我使用这个,我还必须编写我的反序列化方法

那么,您能告诉我如何简单地用XML序列化吗

p、 美国。
我读过一些和我类似的问题,但我不太明白。我的英语不太好:

如果您使用C,您的代码会出现一些问题。我已经做了一些更正,并包含了一些程序集信息,以获得您期望的结果。请参阅下面的代码

以下是您的课程应该如何:

要使用预期结果进行序列化的代码,例如:

您的结果将是:


您应该使用此示例代码

重要的音符

序列化类标记为[Serializable]attirbute 如果类名与xml根标记不同,则类将标记为[XmlRootElementName=XmlTagName]属性 如果序列化类的属性类型为另一个类,则此属性标记为[XmlElementXmlTagName]属性 您可以检查是否进行序列化和反序列化

模型


嗯,您的硬盘类也需要可序列化。你试过什么?看起来不像是有效的c。我相信课堂应该是课堂。此外,通过我见过的任何库进行序列化,只能在属性上工作,不能在字段上工作。@SharkyShark,答案是否满足您的需要?如果是,请标记它。如果没有,告诉我们你的困难。
[System.Serializable]
[System.Xml.Serialization.XmlRoot(ElementName = "hard_disk")]
public class HardDisk
{
    [System.Xml.Serialization.XmlElement]
    public string model { get; set; }

    [System.Xml.Serialization.XmlElement]
    public int size { get; set; }

    public HardDisk() { }
}


[System.Serializable]
[System.Xml.Serialization.XmlRoot(ElementName = "HardwareInfo")]
public class Hardware
{
    [System.Xml.Serialization.XmlElement]
    public string cpu_name { get; set; }

    [System.Xml.Serialization.XmlElement]
    public int ram_size { get; set; }

    [System.Xml.Serialization.XmlElement(ElementName = "hard_disk")]
    public List<HardDisk> hd { get; set; }

    public Hardware()
    {
        hd = new List<HardDisk>();
    }
}
class Program
{
    static void Main(string[] args)
    {
        var hw = new Hardware()
        {
            cpu_name = "ABC Pentium xyz",
            ram_size = 123,
            hd = new List<HardDisk>()
            {
                new HardDisk() {
                    model = "Toshiba XYZ",
                    size = 123
                },
                new HardDisk() {
                    model = "Logitech XYZ",
                    size = 99
                }
            }
        };

        var xml = new System.Xml.Serialization.XmlSerializer(typeof(Hardware));

        var ns = new System.Xml.Serialization.XmlSerializerNamespaces();
        ns.Add("", "");

        xml.Serialize(Console.Out, hw, ns);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<HardwareInfo>
  <cpu_name>ABC Pentium xyz</cpu_name>
  <ram_size>123</ram_size>
  <hard_disk>
    <model>Toshiba XYZ</model>
    <size>123</size>
  </hard_disk>
  <hard_disk>
    <model>Logitech XYZ</model>
    <size>99</size>
  </hard_disk>
</HardwareInfo>
            [Serializable]
            [XmlRoot(ElementName = "HardwareInfo")]
            public class Hardware
            {
                [XmlElement]
                public string cpu_name { get; set; }
                [XmlElement]
                public int ram_size { get; set; }

                [XmlElement("hard_disk")]
                public List<HardDisk> hd { get; set; }                   
            }

            [Serializable]
            [XmlRoot(ElementName = "hard_disk")]
            public class HardDisk
            {
                [XmlElement]
                public string model { get; set; }
                [XmlElement]
                public string size { get; set; }
            }

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string xmlString = @"<HardwareInfo>
                                      <cpu_name> ABC Pentium xyz</cpu_name>
                                      <ram_size> 123 </ram_size>
                                      <hard_disk>
                                        <model>Toshiba XYZ</model>
                                        <size> 123 GB </size>
                                      </hard_disk>
                                      <hard_disk>
                                        <model>Logitech XYZ</model>
                                        <size> 99 GB </size>
                                      </hard_disk>
                                    </HardwareInfo>";

                var result = DeSerialization<Hardware>(xmlString);
            }

            static T DeSerialization<T>(string xmlStrig) where T : class
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));                        
                using (StringReader sReader = new StringReader(xmlStrig))
                {
                    return (T)xmlSerializer.Deserialize(sReader);
                }
            }
        }          
    }