私有字段是否需要序列化xml文件?

问题描述:

在我所有关于xml序列化的学习中,示例都显示了使用具有私人后端存储域的公共属性。私有字段是否需要序列化xml文件?

但后来我发现这一点:

https://blog.udemy.com/csharp-serialize-to-xml/

我还了解到,在C#3.0,你并不总是需要的后备存储领域,因为它是在幕后完成。

所以我应该简化我的代码,并按照链接,只使用公共属性?

+0

如果您使用'XmlSerializer',则没有问题。但是,如果您还将类型标记为'[Serializable]'并且使用'DataContractSerializer',则会在XML中看到丑陋的秘密支持字段名称,如[有没有方法使DataContractSerializer输出更清晰的XML?](https: //*.com/q/1953984)。一般来说''[Serializable]'对自动属性的效果很差,如果你不需要它,你可能想要删除这个属性,并且你不打算使用显式的后台字段。 – dbc

对于XmlSerializer,显式私有后台字段是完全不必要的,它只能序列化public字段和属性。只要支持字段是私有的,XmlSerializer无法检测它是否是明确的或暗中编译器创建作为docs描述方式:

在声明[自动实现的属性],编译器创建一个私人的匿名支持字段,只能通过属性的get和set访问器访问。

如果你只使用XmlSerializer(或DefaultContractResolver.IgnoreSerializableAttribute = true,这是默认的)序列化,正前方去,并通过使用自动实现的属性简化你的类。

但是,请注意,自动执行的属性与[Serializable]效果不佳。当您标记这个属性的类型,你是这表明它可以通过序列化其内部状态被序列化 - 它的公共和私人领域 - 而不是它的外部状态 - 它的公共属性。虽然XmlSerializer完全忽略了该属性,但某些其他序列化器支持该属性,包括DataContractSerializer,DataContractJsonSerializerBinaryFormatter。如果将该属性添加到具有自动实现属性的类型中,秘密“匿名”支持字段的名称可以开始出现在由这些序列化器创建的序列化流中。这有时会导致诸如以下问题中的问题:

所以,如果您使用自动实现的属性,我的建议是从您的类型中删除[Serializable]属性。您可能不需要它,数据协定序列化在没有它的情况下效果更好,并且在任何情况下它的使用都将在.NET Core中被弃用,如herehere所示。(虽然据说二进制序列化是越来越实现在.NET 2.0的核心一定程度上,看到here了解详情。)


为什么领域?在.Net 1.1时间框架中,关于序列化私有状态是否可能优于序列化公共状态仍存在争议。这不再是争论,公共状态(或某些数据合同规定的状态)的序列化是首选。