4

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

  • 使用DataContractSerializer;或者
  • 使用SoapFormatterBinaryFormatter;或者
  • 用读/写属性替换我的只读属性;

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

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不是一个很好的选择,因为结果是 a byte[],我想把它当作string(我不想在反序列化我的对象时处理 Encondings 等)。

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

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

谢谢!

4

2 回答 2

4

好吧,通常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")]

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

于 2009-08-28T14:04:10.027 回答
1

虽然不幸的是,如果 serialize 可以访问私有属性,那么到目前为止,这将是一件好事,但没有简单的方法。

但是架构解决方案还有另一种选择。不要破坏您的业务领域需求,而是像 nTeir 设计那样分离您的层并实现 DTO 的......

如果您将您的业务、datafacade/dataadaptor(工厂模式非常适合这里)和 DataAccess 层分成 3 个项目,您可以通过引用该业务永远不知道您的 DTO 来进行控制。因此,如果您决定删除或实施序列化或将其交换为保存到 SQL Server,您不会影响业务层中的任何内容。

总会有一个失败,还有很多代码要编写: * 您必须为每个要访问 Dataaccess 的实体双向编写对象转换器 * 您可能会破坏一些隐藏在业务中的 .Save 方法的 OO在继续进行数据访问之前,需要在 Dataface 中将其转换为正确的类型

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

于 2009-11-06T09:12:18.500 回答