C#类序列化映射

时间:2015-04-28 10:07:20

标签: c# xml xslt serialization xsd

我正在寻找有关如何实现和/或更改以下类的类序列化行为的提示,想法。

简化(不完整)样本类:

[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>类的结构,除了应用一些XML序列化属性。

这样做的原因不仅在于简化生成的XML,还在于对SQL Server查询生成的XML进行去逐化。我对属性的想法,xsd / xslt转换......

3 个答案:

答案 0 :(得分:1)

如果您无法更改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>

答案 1 :(得分:0)

属性帮助。

[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>

Further reading

答案 2 :(得分:0)

只需将XmlElement添加到类

即可

&#13;
&#13;
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>();
        }
    }
&#13;
&#13;
&#13;