在我对xml序列化的所有了解中,示例显示了使用具有私有后备存储字段的公共属性。
但后来我发现了这个:
https://blog.udemy.com/csharp-serialize-to-xml/
我还了解到,使用c#3.0,您并不总是需要后台存储字段,因为它是在幕后完成的。
我应该简化代码并按照链接使用公共属性吗?
答案 0 :(得分:1)
XmlSerializer
完全不需要明确的私有支持字段,XmlSerializer
只能序列化公共字段和属性。只要支持字段是私有的,XmlSerializer
无法检测编译器是显式创建还是秘密创建,如docs中所述:
当您声明[自动实现的属性]时,编译器会创建一个私有的匿名支持字段,该字段只能通过属性的get和set访问器进行访问。
如果您只是使用XmlSerializer
(或json.net与DefaultContractResolver.IgnoreSerializableAttribute = true
进行序列化,这是默认设置),请使用自动实现的属性直接进行简化,然后使用自动实现的属性。
但是,请注意自动实现的属性与[Serializable]
的效果不佳。当您使用此属性标记类型时,表示可以通过序列化其内部状态 - 其公共和私有字段 1 - 而不是外部状态 - 它的公共属性。虽然DataContractSerializer
完全忽略了此属性,但某些其他序列化程序支持此属性,包括DataContractJsonSerializer
,BinaryFormatter
和[Serializable]
。如果将属性添加到具有自动实现属性的类型,则秘密的名称为#34; anonymous"支持字段可以开始出现在由这些序列化程序创建的序列化流中。这有时会导致以下问题出现问题:
Is there a way to make DataContractSerializer output cleaner XML?
DataContractJsonSerializer generating Ghost string to JSON keys?
Ignore Non Serialized property in BinaryFormatter Serialization
因此,如果您使用自动实现的属性,我的建议是从您的类型中删除development:
server: "http://localhost:9292/faye"
secret_token: "secret"
test:
server: "http://localhost:9292/faye"
secret_token: "secret"
production:
server: "https://my.app.com/faye"
secret_token: "c2c373dd2d7b8d080311d4d32f9710a7c01ee627c30a75ec1143559b74a82c75"
signature_expiration: 86400 # one day
属性。您可能不需要它,数据协定序列化可以在没有它的情况下更好地工作,并且无论如何它在.NET Core中被弃用,如here和here所示。 (虽然据报道二进制序列化在.NET Core 2.0中得到了一定程度的实现,但请参阅here了解详细信息。)
1 为什么是字段?在.Net 1.1时间框架中,仍然存在关于序列化私有状态是否比序列化公共状态更可取的争论。这不再争论,首选公共国家(或某些数据合同规定的州)的序列化。