C# class 序列化映射
C# class serialization mapping
我正在寻找有关如何实现 and/or 更改 class 序列化行为的提示和想法,一般来说 classes。
简化(不完整)示例 classes :
[Serializable]
public class Choobakka
{
public string Name { get; set; }
public VariableList<Item> Stuff { get; set; }
}
[Serializable]
public class Item
{
public string Name { get; set; }
public string Value { get; set; }
}
[Serializable]
public sealed class VariableList<T> : AVariableList<T>
{
public new ItemList<T> Items { get { return _items; } set { _items = value; } }
public new bool IsNull { get { return Items == null; } }
public new bool IsEmpty { get { return IsNull || Count <= 0; } }
public new int Count { get { return IsNull ? 0 : this.Items.Count; } }
public new string CountAsString { get { return Count.ToString(); } }
public VariableList()
{
_items = new ItemList<T>();
}
}
这就是我填写和连载 Choobakka 的东西的方式
var choobakka = new Choobakka() { Name = "CHOO-BAKKA", Stuff = new VariableList<Item>() };
choobakka.Stuff.Items.Add( new Item() { Name = "passport", Value = "lv" } );
choobakka.Stuff.Items.Add( new Item() { Name = "wallet", Value = "50euro" } );
StringBuilder sb = new StringBuilder();
using (TextWriter tw = new StringWriter(sb))
{
XmlSerializer xs = new XmlSerializer(typeof(Choobakka));
xs.Serialize(tw, choobakka);
}
序列化 XML 看起来像:
<Choobakka>
<Name>CHOO-BAKKA</Name>
<Stuff>
<Items>
<Item>
<Name>passport</Name>
<Value>lv</Value>
</Item>
<Item>
<Name>wallet</Name>
<Value>50euro</Value>
</Item>
</Items>
</Stuff>
</Choobakka>
现在的问题是您如何建议将 <Items>
标签(如果可能)设置为
之类的东西
<Choobakka>
<Name>CHOO-BAKKA</Name>
<Stuff>
<Item>
<Name>passport</Name>
<Value>lv</Value>
</Item>
<Item>
<Name>wallet</Name>
<Value>50euro</Value>
</Item>
</Stuff>
</Choobakka>
话虽如此,我无法更改 VariableList<T>
class 的结构,除非应用一些 XML 序列化属性。
这样做的原因不仅是简化了结果 XML,而且还对 SQL 服务器查询生成的 XML 进行了反序列化。我有属性的想法,xsd
/xslt
转换...
属性帮助。
[Serializable]
public class Choobakka
{
public string Name { get; set; }
[XmlElement("ElementName")]
public VariableList<Item> Stuff { get; set; }
}
输出:
<Choobakka>
<Name>CHOO-BAKKA</Name>
<ElementName>
<Name>passport</Name>
<Value>lv</Value>
</ElementName>
<ElementName>
<Name>wallet</Name>
<Value>50euro</Value>
</ElementName>
</Choobakka>
只需将 XmlElement 添加到 class
public sealed class VariableList<T> : AVariableList<T>
{
[XmlElement("Item")]
public new ItemList<T> Items { get { return _items; } set { _items = value; } }
public new bool IsNull { get { return Items == null; } }
public new bool IsEmpty { get { return IsNull || Count <= 0; } }
public new int Count { get { return IsNull ? 0 : this.Items.Count; } }
public new string CountAsString { get { return Count.ToString(); } }
public VariableList()
{
_items = new ItemList<T>();
}
}
如果无法更改 VariableList<>
,则更改 Choobaka
即可
public class Choobakka
{
public string Name { get; set; }
[XmlIgnore]
public VariableList<Item> Stuff { get; set; } // we do not serialize this
[XmlArray("Stuff")]
public Item[] _Stuff // but this
{
get
{
// get Item[] from Stuff property somehow
// ...
// as test
return new Item[] {new Item() { Name = "1", Value = "111"}, new Item() { Name = "2", Value = "222"}};
}
set
{
// set Stuff property from Item[] somehow
// ...
}
}
}
产生 (proof)
<?xml version="1.0" encoding="utf-16"?>
<Choobakka xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>CHOO-BAKKA</Name>
<Stuff>
<Item>
<Name>1</Name>
<Value>111</Value>
</Item>
<Item>
<Name>2</Name>
<Value>222</Value>
</Item>
</Stuff>
</Choobakka>
我正在寻找有关如何实现 and/or 更改 class 序列化行为的提示和想法,一般来说 classes。
简化(不完整)示例 classes :
[Serializable]
public class Choobakka
{
public string Name { get; set; }
public VariableList<Item> Stuff { get; set; }
}
[Serializable]
public class Item
{
public string Name { get; set; }
public string Value { get; set; }
}
[Serializable]
public sealed class VariableList<T> : AVariableList<T>
{
public new ItemList<T> Items { get { return _items; } set { _items = value; } }
public new bool IsNull { get { return Items == null; } }
public new bool IsEmpty { get { return IsNull || Count <= 0; } }
public new int Count { get { return IsNull ? 0 : this.Items.Count; } }
public new string CountAsString { get { return Count.ToString(); } }
public VariableList()
{
_items = new ItemList<T>();
}
}
这就是我填写和连载 Choobakka 的东西的方式
var choobakka = new Choobakka() { Name = "CHOO-BAKKA", Stuff = new VariableList<Item>() };
choobakka.Stuff.Items.Add( new Item() { Name = "passport", Value = "lv" } );
choobakka.Stuff.Items.Add( new Item() { Name = "wallet", Value = "50euro" } );
StringBuilder sb = new StringBuilder();
using (TextWriter tw = new StringWriter(sb))
{
XmlSerializer xs = new XmlSerializer(typeof(Choobakka));
xs.Serialize(tw, choobakka);
}
序列化 XML 看起来像:
<Choobakka>
<Name>CHOO-BAKKA</Name>
<Stuff>
<Items>
<Item>
<Name>passport</Name>
<Value>lv</Value>
</Item>
<Item>
<Name>wallet</Name>
<Value>50euro</Value>
</Item>
</Items>
</Stuff>
</Choobakka>
现在的问题是您如何建议将 <Items>
标签(如果可能)设置为
<Choobakka>
<Name>CHOO-BAKKA</Name>
<Stuff>
<Item>
<Name>passport</Name>
<Value>lv</Value>
</Item>
<Item>
<Name>wallet</Name>
<Value>50euro</Value>
</Item>
</Stuff>
</Choobakka>
话虽如此,我无法更改 VariableList<T>
class 的结构,除非应用一些 XML 序列化属性。
这样做的原因不仅是简化了结果 XML,而且还对 SQL 服务器查询生成的 XML 进行了反序列化。我有属性的想法,xsd
/xslt
转换...
属性帮助。
[Serializable]
public class Choobakka
{
public string Name { get; set; }
[XmlElement("ElementName")]
public VariableList<Item> Stuff { get; set; }
}
输出:
<Choobakka>
<Name>CHOO-BAKKA</Name>
<ElementName>
<Name>passport</Name>
<Value>lv</Value>
</ElementName>
<ElementName>
<Name>wallet</Name>
<Value>50euro</Value>
</ElementName>
</Choobakka>
只需将 XmlElement 添加到 class
public sealed class VariableList<T> : AVariableList<T>
{
[XmlElement("Item")]
public new ItemList<T> Items { get { return _items; } set { _items = value; } }
public new bool IsNull { get { return Items == null; } }
public new bool IsEmpty { get { return IsNull || Count <= 0; } }
public new int Count { get { return IsNull ? 0 : this.Items.Count; } }
public new string CountAsString { get { return Count.ToString(); } }
public VariableList()
{
_items = new ItemList<T>();
}
}
如果无法更改 VariableList<>
,则更改 Choobaka
即可
public class Choobakka
{
public string Name { get; set; }
[XmlIgnore]
public VariableList<Item> Stuff { get; set; } // we do not serialize this
[XmlArray("Stuff")]
public Item[] _Stuff // but this
{
get
{
// get Item[] from Stuff property somehow
// ...
// as test
return new Item[] {new Item() { Name = "1", Value = "111"}, new Item() { Name = "2", Value = "222"}};
}
set
{
// set Stuff property from Item[] somehow
// ...
}
}
}
产生 (proof)
<?xml version="1.0" encoding="utf-16"?>
<Choobakka xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>CHOO-BAKKA</Name>
<Stuff>
<Item>
<Name>1</Name>
<Value>111</Value>
</Item>
<Item>
<Name>2</Name>
<Value>222</Value>
</Item>
</Stuff>
</Choobakka>