XmlSerializer,GenerateSerializer和Collections

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警告?

Lor*_*tté 5

很难说:“正确”的设置在很大程度上取决于上下文。只是一个简单的想法:如果将逻辑从“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 内部,而无需在类外部创建它。只是一个想法,如果它不适用,请告诉我。