.net - 序列化为 XML - 私有(private)属性

标签 .net xml-serialization poco

我正在寻找一种方法来序列化包含一些只读属性的 POCO。在一些 Google 和 StackOverflow 搜索中,我看到了以下建议:

  • 使用 DataContractSerializer ;或
  • 使用 肥皂格式化程序 二进制格式化程序 ;或
  • 替换我的只读属性读/写属性 ;

  • 我的类(class)非常简单,它们看起来像:
    public class MyClass
    {
        public int Id { get; private set; }
        public string Name { get; private set; }
        public MyClass(int id, string name)
        {
            Id = id;
            Name = name;
        }
    }
    

    所以,
  • 我不想让我的属性读/写。如果它们是只读的,那是因为我的域模型要求只读属性。领域模型不能因此而改变。
  • 我不想使用 DataContractSerializer ,因为这会用与序列化相关的东西污染我的域模型。
  • BinaryFormatter不是一个很好的选择,因为结果是 byte[] , 我想把它当作 string (我不想在反序列化我的对象时处理 Encondings 等)。

  • 我真正想要的是 能够序列化只读属性的 XmlSerializer 类 .

    你知道任何这样的实现吗?或者任何其他方便的解决方案?

    谢谢!

    最佳答案

    好吧,通常 XmlSerializer无法序列化只读属性...但是可以使用内部集序列化属性:您需要生成 XML 序列化程序集,并使用 InternalsVisibleTo 将其声明为“ friend ”程序集属性。您可以通过将以下代码添加到项目文件来自动执行此操作:

      <Target Name="AfterBuild"
              DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource"
              Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)"
              Outputs="$(OutputPath)$(_SGenDllName)">
        <SGen BuildAssemblyName="$(TargetFileName)"
              BuildAssemblyPath="$(OutputPath)"
              References="@(ReferencePath)"
              ShouldGenerateSerializer="true"
              UseProxyTypes="false"
              KeyContainer="$(KeyContainerName)"
              KeyFile="$(KeyOriginatorFile)"
              DelaySign="$(DelaySign)"
              ToolPath="$(SGenToolPath)">
          <Output TaskParameter="SerializationAssembly"
                  ItemName="SerializationAssembly" />
        </SGen>
      </Target>
    

    在 AssemblyInfo.cs 中:
    [assembly: InternalsVisibleTo("MyAssembly.XmlSerializers")]
    

    当然,您可能不希望属性具有内部集,但如果您这样做,上述解决方案应该可以工作。

    关于.net - 序列化为 XML - 私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1347102/

    相关文章:

    .net - 如何配置 NHibernate 以使用 MS SQL 2016 (RTM)?

    c# - XmlSerialize 枚举标志字段

    perl - XML::Dumper 在输出中使用错误的哈希引用

    c++ - 完整的 C++ "from scratch"框架

    c# - 为什么我不能在 WebForm 中声明 UserControl 的子元素(属性)?

    .net - 在 Azure Pipelines 上构建 .NET Core 3.0

    c# - 测试一个类是否可以被序列化

    c# - 我可以强制 POCO 中的字段只在类型初始化程序中设置吗?

    linux - 如何剥离我的 Yocto Linux?

    c# - Entity Framework 数据建模最佳实践