自定义XML序列化 - 包括类名自定义、序列化、XML

2023-09-05 00:22:14 作者:爺雖不帥、但也不賴

我下面的XML序列化后输出是:

 < XML版本=1.0&GT?;
<消息>
  <版> 1.0< /版>
  <车身及GT;
    < ExampleObject的xmlns:XSI =htt​​p://www.w3.org/2001/XMLSchema-instance的xmlns:XSD =htt​​p://www.w3.org/2001/XMLSchema>
      < EmampleOne>你好<!/ EmampleOne>
    < / ExampleObject>
  < /身体>
< /消息>
 

我有以下类:

  [Serializable接口]
    公共类消息< T>
    {
        公共字符串版本{获得;组; }
        公共牛逼身体{获得;组; }
    }

[可序列化]
公共类ExampleObject
{
    公共字符串EmampleOne {获得;组; }
}
 

如果我单独序列化他们,我得到:

 < XML版本=1.0&GT?;
<消息>
  <版> 1.0< /版>
  <车身及GT;
    < EmampleOne>你好<!/ EmampleOne>
  < /身体>
< /消息>
 
C 之xml序列化

 < XML版本=1.0&GT?;
< ExampleObject>
  < EmampleOne>你好<!/ EmampleOne>
< / ExampleObject>
 

所以,如上图所示,我想内部主体包含类的名称< ExampleObject>

我用仿制药,因为我需要有不同的邮件正文的,我用code序列:

  VAR OBJ =新的消息< ExampleObject>
{
    版本=1.0,
    车身=例子
};

VAR serializer2 =新的XmlSerializer(typeof运算(消息< ExampleObject>));
 

解决方案

由于@Marc Gravell在他的评论所说,你可以使用的 XmlAttributeOverrides :

  VAR xmlOverrides =新XmlAttributeOverrides();
VAR属性=新XMLATTRIBUTES();
attributes.XmlElements
     。新增(新XmlElementAttribute(ExampleObject的typeof(ExampleObject)));
xmlOverrides.Add(typeof运算(消息< ExampleObject>),身体,属性);

VAR serializer2 =新的XmlSerializer(typeof运算(消息< ExampleObject>),xmlOverrides);
 

I'm after the following XML serialization output:

<?xml version="1.0"?>
<Message>
  <Version>1.0</Version>
  <Body>
    <ExampleObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <EmampleOne>Hello!</EmampleOne>
    </ExampleObject>
  </Body>
</Message>

I have the following classes:

[Serializable]
    public class Message<T>
    {
        public string Version { get; set; }
        public T Body { get; set; }
    }

[Serializable]
public class ExampleObject
{
    public string EmampleOne { get; set; }
}

If I serialize them separately I get:

<?xml version="1.0"?>
<Message>
  <Version>1.0</Version>
  <Body>
    <EmampleOne>Hello!</EmampleOne>
  </Body>
</Message>

And:

<?xml version="1.0"?>
<ExampleObject>
  <EmampleOne>Hello!</EmampleOne>
</ExampleObject>

So as shown above I'm wanting the inner body to contain the class name <ExampleObject>.

I use generics as I need to have different Message Body's, I serialize with the code:

var obj = new Message<ExampleObject>
{
    Version = "1.0",
    Body = example
};

var serializer2 = new XmlSerializer(typeof (Message<ExampleObject>));

解决方案

As @Marc Gravell suggested in his comment, you can use XmlAttributeOverrides:

var xmlOverrides = new XmlAttributeOverrides();
var attributes = new XmlAttributes();
attributes.XmlElements
     .Add(new XmlElementAttribute("ExampleObject", typeof (ExampleObject)));
xmlOverrides.Add(typeof(Message<ExampleObject>), "Body", attributes);

var serializer2 = new XmlSerializer(typeof(Message<ExampleObject>), xmlOverrides);