C# 如何将 serialize/deserialize 字符串数组作为一系列命名元素
C# How to serialize/deserialize a string array as a series of named elements
我参考了这个问题:Using XmlSerializer with an array in the root element
<?xml version="1.0" encoding="utf-8"?>
<Subscribers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SubscriberList>
<Subscriber>
<Email>test@somewhere.com</Email>
<SubscriptionList>
<Subscription>
<Source>TFSBuildServiceHost.2013</Source>
</Subscription>
<Subscription>
<TextContains>
<string>ABC</string>
<string>DEF</string>
<string>XYZ</string>
</TextContains>
</Subscription>
</SubscriptionList>
</Subscriber>
</SubscriberList>
</Subscribers>
这就是我想要 XML 的样子。我怎样才能更改下面的代码以这种方式构建它。
<Subscription>
<TextContains>ABC</TextContains>
<TextContains>DEF</TextContains>
<TextContains>XYZ</TextContains>
</Subscription>
这是我要序列化的 class 定义:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace EventLog_Reporter
{
public class Subscription
{
public string Source;
public List<string> TextContains;
public List<string> UCTextContains;
public List<string> TextExcludes;
public List<string> UCTextExcludes;
}
public class Subscriber
{
public string Group;
public string Email;
public List<Subscription> SubscriptionList;
}
public class Subscribers
{
public List<Subscriber> SubscriberList;
}
}
这是我将序列化对象写入 XML 文件的代码:
public static void testSerialization()
{
Subscribers subscribers = new Subscribers();
Subscription subscription1 = new Subscription();
Subscription subscription2 = new Subscription();
Subscriber subscriber1 = new Subscriber();
subscription2.TextContains = new List<string>();
subscription2.TextContains.Add("ABC");
subscription2.TextContains.Add("DEF");
subscription2.TextContains.Add("XYZ");
subscription1.Source = "TFSBuildServiceHost.2013";
subscriber1.Email = "test@somewhere.com";
subscriber1.SubscriptionList = new List<Subscription>();
subscriber1.SubscriptionList.Add(subscription1);
subscriber1.SubscriptionList.Add(subscription2);
subscribers.SubscriberList = new List<Subscriber>();
subscribers.SubscriberList.Add(subscriber1);
string strOutFilenameXMLSerializer = "xmlSerializerObjectTest1.xml";
StreamWriter sw = new StreamWriter(strOutFilenameXMLSerializer);
XmlSerializer xmlSerializer = new XmlSerializer(subscribers.GetType());
xmlSerializer.Serialize(sw, subscribers);
sw.Close();
}
谢谢。
您可以使用 [XmlElement]
属性来指定您的 List<string>
应该在没有外部包装元素的情况下进行序列化:
public class Subscription
{
public string Source;
[XmlElement]
public List<string> TextContains;
[XmlElement]
public List<string> UCTextContains;
[XmlElement]
public List<string> TextExcludes;
[XmlElement]
public List<string> UCTextExcludes;
}
这样做会导致列表被序列化为一系列元素,每个元素的名称都与正在序列化的列表 属性 相同,在本例中为 TextContains
。
如果您需要覆盖元素名称,可以在属性构造函数中指定:
[XmlElement("Contains")]
public List<string> TextContains;
我参考了这个问题:Using XmlSerializer with an array in the root element
<?xml version="1.0" encoding="utf-8"?>
<Subscribers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SubscriberList>
<Subscriber>
<Email>test@somewhere.com</Email>
<SubscriptionList>
<Subscription>
<Source>TFSBuildServiceHost.2013</Source>
</Subscription>
<Subscription>
<TextContains>
<string>ABC</string>
<string>DEF</string>
<string>XYZ</string>
</TextContains>
</Subscription>
</SubscriptionList>
</Subscriber>
</SubscriberList>
</Subscribers>
这就是我想要 XML 的样子。我怎样才能更改下面的代码以这种方式构建它。
<Subscription>
<TextContains>ABC</TextContains>
<TextContains>DEF</TextContains>
<TextContains>XYZ</TextContains>
</Subscription>
这是我要序列化的 class 定义:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace EventLog_Reporter
{
public class Subscription
{
public string Source;
public List<string> TextContains;
public List<string> UCTextContains;
public List<string> TextExcludes;
public List<string> UCTextExcludes;
}
public class Subscriber
{
public string Group;
public string Email;
public List<Subscription> SubscriptionList;
}
public class Subscribers
{
public List<Subscriber> SubscriberList;
}
}
这是我将序列化对象写入 XML 文件的代码:
public static void testSerialization()
{
Subscribers subscribers = new Subscribers();
Subscription subscription1 = new Subscription();
Subscription subscription2 = new Subscription();
Subscriber subscriber1 = new Subscriber();
subscription2.TextContains = new List<string>();
subscription2.TextContains.Add("ABC");
subscription2.TextContains.Add("DEF");
subscription2.TextContains.Add("XYZ");
subscription1.Source = "TFSBuildServiceHost.2013";
subscriber1.Email = "test@somewhere.com";
subscriber1.SubscriptionList = new List<Subscription>();
subscriber1.SubscriptionList.Add(subscription1);
subscriber1.SubscriptionList.Add(subscription2);
subscribers.SubscriberList = new List<Subscriber>();
subscribers.SubscriberList.Add(subscriber1);
string strOutFilenameXMLSerializer = "xmlSerializerObjectTest1.xml";
StreamWriter sw = new StreamWriter(strOutFilenameXMLSerializer);
XmlSerializer xmlSerializer = new XmlSerializer(subscribers.GetType());
xmlSerializer.Serialize(sw, subscribers);
sw.Close();
}
谢谢。
您可以使用 [XmlElement]
属性来指定您的 List<string>
应该在没有外部包装元素的情况下进行序列化:
public class Subscription
{
public string Source;
[XmlElement]
public List<string> TextContains;
[XmlElement]
public List<string> UCTextContains;
[XmlElement]
public List<string> TextExcludes;
[XmlElement]
public List<string> UCTextExcludes;
}
这样做会导致列表被序列化为一系列元素,每个元素的名称都与正在序列化的列表 属性 相同,在本例中为 TextContains
。
如果您需要覆盖元素名称,可以在属性构造函数中指定:
[XmlElement("Contains")]
public List<string> TextContains;