XmlSerializer输出xml类型

本文关键字:类型 xml 输出 XmlSerializer | 更新日期: 2023-09-27 18:16:02

我正在使用XmlSerializer,并且想知道是否有任何方法,使用覆盖或类似的东西来获得XmlSerializer输出一些节点的类型。

我的问题是我序列化了一个字节数组。

class MyClass {
  public string Name { get; set; }
  public byte[] Bytes { get; set; }
}

我在一个通用服务中使用xml。服务将xml收集为。

<MyClass>
  <Name>Test</Name>
  <Bytes>U2NhcnkgQnVnZ2Vy</Bytes>
</MyClass>

有没有办法在运行时生成xsd,或者以某种方式输出这样的东西?

我不能改变我正在序列化的类,但我可以对序列化器应用重写或以其他方式控制序列化。

<Bytes xsi:type='BinaryOfSomeKind'>BlahBlah</Bytes>

我需要知道数据是二进制的。

感谢Craig。

XmlSerializer输出xml类型

如果您的类是由第三方提供的,那么您知道您的属性和属性类型,并且可以从中推断出您的XML和XSD。您可以手动创建XSD,也可以借助XML工具,例如XMLSpy(不是免费的)或XMLFox(免费的)。

如果你知道xml将是你在问题中输入的格式,并且你已经准备好了你的类,你可以将它装饰成这样,以便它被反序列化。

反序列化类:

[XmlTypeAttribute]
[XmlRootAttribute("MyClass")]
public class MyClass
{
    [XmlElementAttribute("Name")]
    public string Name { get; set; }
    [XmlElementAttribute("Bytes")]
    public byte[] Bytes { get; set; }
}

反序列化方法

 public static object Deserialize(string xml)
 {
        var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(MyClass));
        using (var reader = XmlReader.Create(new StringReader(xml)))
        {
            return (MyClass)deserializer.Deserialize(reader);
        }
 }

Main Method

    static void Main(string[] args)
    {
        string xml = @"<MyClass>
        <Name>Test</Name>
        <Bytes>U2NhcnkgQnVnZ2Vy</Bytes>
         </MyClass>";
        MyClass obj = (MyClass)Deserialize(xml);
        Console.ReadKey();
    }

确保添加以下using语句:

using System.Xml.Serialization;
using System.Xml; 

它将其反序列化为一个以"Test"作为字节数组的对象。

如果你在运行时生成XSD,那么就没有办法知道有什么属性,这将是使用反射来测试特定的属性,然后找出他们可能是什么类型,这是你的后?