【发布时间】:2013-02-07 04:13:54
【问题描述】:
我们的项目中有一些设置类,它们使用来自一些 .config 文件的 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; }
}
}
我们使用属性 [XmlSerializerAssembly] 来获得读取和写入设置的最佳性能。 这是我的问题:我们使用 Collection 来避免 CA 警告“不要使用数组”。当我们公开 SubSetups 的设置器时,我们会收到 CA-Warning CA2227“不要公开集合的设置器”。如果我们将属性 SubSetups 的设置器设为私有(就像在代码示例中一样),我们将在生成的序列化程序中得到一个错误。方法“GenerateSerializer”(在我们的一个工具中调用)代码有这样一行:
if (o.SubSetups == null) o.SubSetups = new Collection<SubSetupXml>();
如果我们将 setter 设为私有,我们将在构建序列化程序期间收到 CS0200“无法分配属性子设置”。 有谁知道如何在不抑制 CA 警告的情况下使用生成的序列化程序进行正确设置?
【问题讨论】:
-
我认为你不应该盲目地遵循 CA 警告。在某些情况下,使用引起警告的代码是最好的选择,当然比尝试解决它、试错风格要好。
标签: c# xml-serialization