XmlSerializer输出xml类型

时间:2011-11-28 11:38:15

标签: c# binary xmlserializer

我正在使用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>

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

由于

克雷格。

2 个答案:

答案 0 :(得分:0)

如果您知道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);
        }
 }

主要方法

    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; 

它将它反序列化为一个obj,其中“Test”作为字节数组。

如果你在运行时生成XSD,那么你无法知道它们有哪些属性,而是使用反射来测试特定的属性,然后找出它们可能是什么类型,这是你的追求是什么?

答案 1 :(得分:0)

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