繁体   English   中英

类属性的序列化?

[英]Serialization of class attributes?

默认的XmlSerializer能够将类属性序列化为Xml属性?

[MyClassTypeAttribute(ClassType.MyClass)]
public MyClass : BaseClass {

}

会变成

<myclass MyClassType="MyClass">

原因

我有一个WCF服务,该服务通过相同的操作协定向我发送不同的对象,所有这些都源自BaseClass 为了知道对象是哪种类型并直接进行转换(然后将其序列化为Xml以随后写入文档中),我想具有一些'type'属性( enum )。

当然,一种可能性是将属性声明为XmlAttribute

[XmlAttribute(params)]
public MyClassType { get; set; }

这里的问题是: XmlSerializer (还有DataContractSerializer ,AFIAK)迫使我在每个属性上都有一个setter 我知道我可以将setter声明为protected并且它仍然可以正常工作( XmlSerializer ,您这可恶的小事情 ),但是我不太喜欢该解决方案,因为1)我认为我有理由将设置器排除在外通常波苏斯和2)声明一些属性为XmlAttributes等,作为XmlElements是混淆了(这就像把猫炖牛肉

(此外,是否可以强制派生类声明某些属性?)

[abstract MyClassTypeAttribute]

如果是关于您的班级类型的,那么这里是一个示例:

  [XmlIncludeAttribute(typeof(ConcreteFooOne))]
  [XmlIncludeAttribute(typeof(ConcreteFooTwo))]
  [XmlIncludeAttribute(typeof(ConcreteFooThree))]
  [XmlRoot(ElementName = "FooData", Namespace = "http://foo.bar")]
  public abstract partial class AbstractFoo
  {
    // Some abstract props etc.
  }

  [XmlRoot(ElementName = "FooData", Namespace = "http://foo.bar")]
  public class ConcreteFooOne : AbstractFoo
  {
    public int MyProp { get; set; }
  }
  [XmlRoot(ElementName = "FooData", Namespace = "http://foo.bar")]
  public class ConcreteFooTwo : AbstractFoo
  {

  }
  [XmlRoot(ElementName = "FooData", Namespace = "http://foo.bar")]
  public class ConcreteFooThree : AbstractFoo
  {

  }

  class Program
  {
    static void Main(string[] args)
    {
      var serializer = new System.Xml.Serialization.XmlSerializer(typeof(AbstractFoo));
      using (var stream = new FileStream("test.txt", FileMode.OpenOrCreate))
      {
        serializer.Serialize(stream, new ConcreteFooOne() { MyProp = 10 });
        stream.Flush();
      }


      using (var stream = new FileStream("test.txt", FileMode.OpenOrCreate))
      {
        var c = serializer.Deserialize(stream);
      }
    }
  }

该代码将序列化并包含type属性,并且在反序列化时将获得正确的实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM