[英]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.