Fis*_*aen 8 c# xml-serialization
我们的项目中有一些安装类,它们使用来自某些.config-Files的XmlSerializer进行序列化/反序列化.在其中一些安装类中,我们有子设置的集合,如下所示:
using System;
using System.Collections.ObjectModel;
using System.Xml.Serialization;
namespace Datev.Framework.Shared.Actions.Setup
{
[Serializable]
[XmlSerializerAssembly]
[XmlRoot("setup")]
public class SetupXml
{
public SetupXml()
{
SubSetups = new Collection<SubSetupXml>();
}
[XmlArray("subSetups")]
[XmlArrayItem("subSetup")]
public Collection<SubSetupXml> SubSetups { get; private set; }
}
[Serializable]
public class SubSetupXml
{
[XmlElement("someValue")]
public string SomeValue { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我们使用属性[XmlSerializerAssembly]来获得读写设置的最佳性能.这是我的问题:我们使用Collection来避免CA警告"不要使用数组".当我们公开SubSetup的setter时,我们得到CA-Warning CA2227"不要公开集合的setter".如果我们将属性SubSetups的setter设为私有(如代码示例中所示),我们将在生成的序列化程序中出错.方法"GenerateSerializer"(在我们的工具中调用)代码有这样一行:
if (o.SubSetups == null) o.SubSetups = new Collection<SubSetupXml>();
Run Code Online (Sandbox Code Playgroud)
如果我们将setter设为私有,我们将在构建序列化程序时获得CS0200"Property SubSetups".有没有人知道如何使用生成的序列化程序进行正确设置而不抑制CA警告?
很难说:“正确”的设置在很大程度上取决于上下文。只是一个简单的想法:如果将逻辑从“GenerateSerializer”移动到属性 getter 会发生什么?可以接受吗?
[XmlArray("subSetups")]
[XmlArrayItem("subSetup")]
public Collection<SubSetupXml> SubSetups {
get {
// subSetups needs to be a backing (private) field... is this a problem?
if (this.subSetups == null) this.subSetups = new Collection<SubSetupXml>();
}
private set;
}
Run Code Online (Sandbox Code Playgroud)
这样,在“GenerateSerializer”中,您只需获取集合。如果尚未创建集合,它将在 getter 内部,而无需在类外部创建它。只是一个想法,如果它不适用,请告诉我。