代码之家  ›  专栏  ›  技术社区  ›  Bruno Reis

序列化为XML私有属性

  •  4
  • Bruno Reis  · 技术社区  · 15 年前

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

    • 使用 数据序列化程序 ; 或
    • 使用 二进制格式 ; 或
    • 读/写属性

    我的课程非常简单,它们看起来像:

    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 (在反序列化我的对象时,我不想处理Enconding和类似的问题)。

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

    你知道有这样的实施吗?还是其他方便的解决方案?

    谢谢

    2 回复  |  直到 15 年前
        1
  •  4
  •   Thomas Levesque    15 年前

    嗯,通常 XmlSerializer 无法序列化只读属性。。。但是,可以使用内部集合序列化属性:您需要生成XML序列化程序集,并使用 InternalsVisibleTo 属性通过将以下代码添加到项目文件中,可以自动执行此操作:

      <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")]
    

        2
  •  1
  •   Choco Smith    15 年前

    如果serialize能够访问私有属性,那就太好了。不幸的是,到目前为止,还没有简单的方法。

    不要破坏您的业务领域需求,而是像nTeir设计一样分离您的层,并实现DTO的。。。

    如果您将您的业务、datafacade/DataAdapter(工厂模式非常适合这里)和DataAccess层分离为3个项目,您可以通过引用业务部门从不知道您的DTO来控制这些项目。

    *您可能会破坏一些隐藏的OO,因为业务中的.Save方法需要在转到dataaccess之前转换为Dataface中的正确类型

    你可以用nHybinate或类似的东西使这一切变得更容易。 巧克力