C# 如何使用属性序列化字符串值列表

C# 如何使用属性序列化字符串值列表,c#,xml,serialization,xml-serialization,C#,Xml,Serialization,Xml Serialization,我有个问题。如何序列化同时具有属性的字符串项列表 <xml> <metadata> <entry key="key1">string1</entry> <entry key="key2">string2</entry> <entry key="key3">string3</entry> </metadata> </xml

我有个问题。如何序列化同时具有属性的字符串项列表

<xml>
    <metadata>
        <entry key="key1">string1</entry>
        <entry key="key2">string2</entry>
        <entry key="key3">string3</entry>
    </metadata>
</xml>

string1
string2
弦3
我知道如何在没有属性的情况下做到这一点,但我不知道如何在我的情况下做到这一点:

[Serializable]
[XmlRoot(ElementName = "xml")]
public class MyXml
{
    [XmlArray(ElementName = "metadata")]
    [XmlArrayItem(ElementName = "entry")]
    public List<string> Metadata { get; set; }
}
[可序列化]
[XmlRoot(ElementName=“xml”)]
公共类MyXml
{
[XmlArray(ElementName=“metadata”)]
[XmlArrayItem(ElementName=“entry”)]
公共列表元数据{get;set;}
}

类似的东西可能适用

class Entry{
   [XmlAttribute("key")]
   public string key {get;set;}
   [XmlText]
   public string entry{get;set;}
}

[Serializable]
[XmlRoot(ElementName = "xml")]
public class MyXml
{
   [XmlArray(ElementName = "metadata")]
   [XmlArrayItem(ElementName = "entry")]
   public List<Entry> Metadata { get; set; }
}
类条目{
[XmlAttribute(“键”)]
公共字符串密钥{get;set;}
[XmlText]
公共字符串项{get;set;}
}
[可序列化]
[XmlRoot(ElementName=“xml”)]
公共类MyXml
{
[XmlArray(ElementName=“metadata”)]
[XmlArrayItem(ElementName=“entry”)]
公共列表元数据{get;set;}
}

您需要引入一个类来表示
条目
,该类允许您提取
属性和值

public class Entry
{
    [XmlAttribute("key")]
    public string Key { get; set; }
    [XmlText]
    public string Value { get; set; }
}

[XmlRoot(ElementName="xml")]
public class MyXml
{
    [XmlArray("metadata")]
    [XmlArrayItem("entry")]
    public List<Entry> Metadata { get; set; }
}
公共类条目
{
[XmlAttribute(“键”)]
公共字符串密钥{get;set;}
[XmlText]
公共字符串值{get;set;}
}
[XmlRoot(ElementName=“xml”)]
公共类MyXml
{
[XmlArray(“元数据”)]
[XmlArrayItem(“条目”)]
公共列表元数据{get;set;}
}

您的
元数据
列表应定义一个名为
条目
的新类型,该类型应如下所示

  [Serializable]

   public   class Entry
    {
       [XmlAttribute]
        public string Key { get; set; }
        [XmlText]
       public string value { get; set; }
    }
这是你的主要课程

class Program
    {
        static void Main(string[] args)
        {

            MyXml  xml  = new MyXml();
            xml.Metadata.Add( new Entry(){Key = "test","content"});
        }


    }
    [Serializable]
    [XmlRoot(ElementName = "xml")]
    public class MyXml
    {
        [XmlArray(ElementName = "metadata")]
        [XmlArrayItem(ElementName = "entry")]
        public List<Entry> Metadata { get; set; }
    }
类程序
{
静态void Main(字符串[]参数)
{
MyXml=新的MyXml();
添加(新条目(){Key=“test”,“content”});
}
}
[可序列化]
[XmlRoot(ElementName=“xml”)]
公共类MyXml
{
[XmlArray(ElementName=“metadata”)]
[XmlArrayItem(ElementName=“entry”)]
公共列表元数据{get;set;}
}

您需要创建一个单独的类来保存
XmlAttribute
XmlText

public class Entry
{
    [XmlAttribute("key")]
    public string Key { get; set; }
    [XmlText]
    public string Value { get; set; }
}

[Serializable]
[XmlRoot(ElementName = "xml")]
public class MyXml
{
    [XmlArray(ElementName = "metadata")]
    [XmlArrayItem(ElementName = "entry")]
    public List<Entry> Metadata { get; set; }
}
公共类条目
{
[XmlAttribute(“键”)]
公共字符串密钥{get;set;}
[XmlText]
公共字符串值{get;set;}
}
[可序列化]
[XmlRoot(ElementName=“xml”)]
公共类MyXml
{
[XmlArray(ElementName=“metadata”)]
[XmlArrayItem(ElementName=“entry”)]
公共列表元数据{get;set;}
}
然后,您可以选择序列化程序对其进行序列化

var item = new MyXml
{
    Metadata = new List<Entry>
    {
        new Entry { Key = "key1", Value = "entry1" },
        new Entry { Key = "key2", Value = "entry2" },
        new Entry { Key = "key3", Value = "entry3" }
    }
};

var serializer = new XmlSerializer(typeof(MyXml));

string xml;

using(var stream = new StringWriter())
using(var writer = XmlWriter.Create(stream,
                                    new XmlWriterSettings { Indent = true }))
{
    serializer.Serialize(writer, item);
    xml = stream.ToString();
}

Console.WriteLine(xml);
var item=newmyxml
{
元数据=新列表
{
新条目{Key=“key1”,Value=“entry1”},
新条目{Key=“key2”,Value=“entry2”},
新条目{Key=“key3”,Value=“entry3”}
}
};
var serializer=newxmlserializer(typeof(MyXml));
字符串xml;
使用(var stream=new StringWriter())
使用(var writer=XmlWriter.Create)(流,
新的XmlWriterSettings(缩进=true})
{
序列化器。序列化(编写器,项);
xml=stream.ToString();
}
Console.WriteLine(xml);
结果:

<?xml version="1.0" encoding="utf-16"?>
<xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <metadata>
    <entry key="key1">entry1</entry>
    <entry key="key2">entry2</entry>
    <entry key="key3">entry3</entry>
  </metadata>
</xml>

入口1
入口2
入口3