我有一個序列化爲XML的類「產品」。我使用標準的System.Xml.Serialization.XmlSerializer來序列化和一個XmlWriter'writer'對象來將序列化結果寫入StreamWriter對象。串行器對象現在連載一氣呵成全班同學:序列化字典<string,string>成員到XML元素和數據
XmlSerializer serializer = new XmlSerializer(typeof(products));
serializer.Serialize(writer, products);
類有一個字典<字符串,字符串>成員稱爲「規格」。它是動態構建的,所以我事先不知道密鑰。這裏的字典可能包含的數據的一個例子(鍵:值):
- 顏色:藍色
- 長度:110毫米
- 寬度:55毫米
我想能夠將該屬性序列化爲:
...
<specifications>
<color>blue</color>
<length>110mm</length>
<width>55mm</width>
</specifications>
...
我知道這是糟糕的XML設計,但它必須符合第三方規範。
是否有可以使用的標準屬性?如果沒有,我將如何能夠像這樣序列化字典?
如果您需要更多的代碼片段,請告訴我。
編輯: 由於需要一些變化,我讓字典<字符串,字符串>的去。相反,我創建了一個類「規範」:
public class Specification
{
public string Name;
public string Value;
public bool IsOther;
public Specification() : this(null, null, false) { }
public Specification(string name, string value) : this(name, value, false) { }
public Specification(string name, string value, bool isOther)
{
Name = name;
Value = value;
IsOther = isOther;
}
}
爲了避免在產品類具有「規範」的列表重複元件「規格」,我使用了多個類的「規格」實現IXmlSerializable
public class Product
{
public Product()
{
Specifications = new Specifications();
}
[XmlElement("specs")]
public Specifications Specifications;
//this "feature" will not include <specs/> when there are none
[XmlIgnore]
public bool SpecificationsSpecified { get { return Specifications.Specs.Any(); } }
//...
}
感謝你們提供了IXmlSerializable的和XmlWriter的例子:接口:作爲
public class Specifications: IXmlSerializable
{
public List<Specification> Specs = new List<Specification>();
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
//I don't need deserialization, but it would be simple enough now.
throw new System.NotImplementedException();
}
public void WriteXml(XmlWriter writer)
{
//write all "standarad", named specs
//this writes the <color>blue</color>-like elements
Specs.Where(s => !s.IsOther).ToList().ForEach(s => writer.WriteElementString(s.Name, s.Value));
//write other specs
//this writes <other_specs>{name|value[;]}*</other_specs>
string otherSpecs = string.Join(";", Specs.Where(s => s.IsOther).Select(s => string.Concat(s.Name, "|", s.Value)));
if (otherSpecs.Length > 0) writer.WriteElementString("other_specs", otherSpecs);
}
}
類 「規範」 適用。我不知道XmlWriter的界面和用法 - 這對我來說是一個很有價值的靈感!
*這是我的第一個SO問題。什麼是最合適的方式來關閉它?我沒有提供這個作爲我自己的答案,因爲它不是我最初的問題(關於詞典)的真實答案。
我認爲[此示例](http://huseyint.com/2007/12/xml-serializable-generic-dictionary-tipi/)可以幫助您:檢查WriteXml方法並根據您的需要進行相應更改... – Marco
你可能看看這裏,因爲字典本身在遺憾的不可序列化:http://stackoverflow.com/questions/12856456/c-sharp-serialize-dictionary-parameter-without-parent-node – HimBromBeere
你事先知道將出現的密鑰,還是需要序列化出現的任何密鑰? – dbc