【问题标题】:XmlSerializer output xml typesXmlSerializer 输出 xml 类型
【发布时间】:2011-11-28 11:38:14
【问题描述】:

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

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

谢谢

克雷格。

【问题讨论】:

  • 我不知道我是否正确理解了您的问题。您是否使用始终具有相同结构但元素类型可能不同的 XML?
  • 我正在将一个类转换为 xml。该类由第三方提供。我正在接受 xml 并对内容进行索引。我需要知道哪些字段是二进制的。如果有一种简单的方法可以生成 xsd,我也可以接受。我可以提供代码来生成 xsd。也许这是一个愚蠢的问题。
  • 如果您的类是由第三方提供的,那么您就知道您的属性和属性类型,并且可以从中推断出您的 XML。您甚至可以手动为其创建 XSD。
  • 我想我会手动创建一个xsd。我希望已经有一个类可以创建 xsd。我会手动完成。如果你回答这个问题,我会标记它,因为这是尽可能接近的。

标签: c# binary xmlserializer


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    它将它反序列化为一个以“Test”为字节数组的obj。

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

    【讨论】:

    • 嗨,很遗憾,这行不通。我没有格式。我需要知道字符串是二进制的。我需要将类型添加到传出 xml 或生成模式或编写我自己的序列化程序。你的解决方案是不够的。我很清楚,如果我知道它的二进制文件,但我不知道,序列化程序就可以工作。
    • 所以你试图控制MyClass 是如何被序列化的,但是你根本不能装饰这个类。但是您需要以您描述的格式输出它吗?对吗?
    • 我可以用任何属性装饰类,因为它们可以在覆盖中传递给序列化程序。我可以生成一个xsd。我可以反思课程我可以序列化课程。我只需要知道二进制字段的 xml 类型是什么。我想我要放弃序列化程序并使用反射。我不能改变班级。该类由第三方提供。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多