这不是一个问题,但更像是我最近的想法。 我将XmlAttribute作为XmlSerialize类作为示例:您可以将属性设置为类以选择应该序列化哪些属性,但是通过实现一个teorical接口IXmlSerializable可以很容易地完成同样的事情(它确实存在类似的东西,我不记得了)并且为该类重载了一个方法“Serialize”,它只对你要序列化的属性调用Serialize(this.myProp1.Serialize()),对于反序列化
所以我基本上说的是:属性方法有点多余吗? (我实际上喜欢它,但我发现它与界面在逻辑上并不相同)
感谢您的回答,正如我所说,这只是一个想法...希望有人会觉得有趣
更新1:我以错误的方式解释自己,我问的是“我为什么要选择属性而不是接口(或相反)”,不完全是这个具体情况(我接受了序列化,因为这是我脑子里想到的第一件事,顺便感谢你的回答,因为它们非常有趣
答案 0 :(得分:8)
从评论和downvote,也许我应该突出我的主要观点:可以节省我小时的工作(每种类型)和可怕的代码复杂性非常不强烈的,多余的,但非常非常欢迎。
“很容易”?好;我在序列化方面非常有经验,但实现的目的是不我称之为简单。事实恰恰相反。
如果您不想使用属性,XmlSerializer
会出现重载,允许您在运行时对其进行配置。
但每当我听到“实施IXmlSerializable
”时,我都会感到不寒而栗。属性方法非常简单快捷:
[XmlRoot("foo"), XmlType("foo")]
[XmlInclude(typeof(SuperFoo))]
public class Foo {
public string X {get;set;}
[XmlAttribute("y")]
public int? Y {get;set;}
[XmlElement("item")]
public List<string> Items {get;set;}
}
public class SuperFoo : Foo {}
我挑战你在2小时内为非常简单的例子编写{strong>强大的IXmlSerializable
实现...并记住你写的每一行是你必须维护的一条线。
答案 1 :(得分:4)
嗯,从我能说的最好的情况来看,它们在逻辑上是不同的。
实现IXmlSerializable会直接影响类本身,因为您要在类的实现中添加一个接口和一个或多个方法。从本质上讲,您正在为自己的类序列化直接负责。
但是,添加XmlAttribute属性不会直接影响类的功能,而只是使用属性对其进行装饰,以便XmlSerializer可以执行实际的序列化功能。在这种情况下,您将序列化推迟到XmlSerializer类,并为XmlSerializer提供足够的有关您的类的元数据来完成它。
这就是为什么我更喜欢后一种属性方法。当我写一个类时,我希望它是可序列化的,但我关心的最后一件事是实现的细节,所以我总是从thaqt方法开始,99%的时候它只用很少的工作就可以正常工作。但是,如果确实需要对序列化进行更细粒度的控制,请实现IXmlSerializable接口并编写自己的序列化代码。
答案 2 :(得分:1)
实现接口的编程方法可以提供更多控制(并且可能更快),但是比属性方法更难创建和维护。我主要使用属性。
答案 3 :(得分:1)
您可以选择属性来(不)使用属性进行序列化。接口的实现是按代码序列化。