4

いくつかの読み取り専用プロパティを含む POCO をシリアル化する方法を探しています。いくつかの Google および StackOverflow の検索で、次の提案を見ました。

  • DataContractSerializerを使用します。また
  • SoapFormatterまたはBinaryFormatterを使用します。また
  • 読み取り専用プロパティを読み取り/書き込みプロパティに置き換えます。

私のクラスは非常に単純で、次のようになります。

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。シリアライゼーション関連のものでドメイン モデルが汚染されるからです。
  • BinaryFormatterbyte[]結果が aであるため、あまり良いオプションではstringありません.

私が本当に欲しいのは、読み取り専用プロパティをシリアル化できる XmlSerializer クラスです。

そのような実装を知っていますか?または他の便利なソリューションはありますか?

ありがとう!

4

2 に答える 2

4

通常、読み取り専用プロパティをシリアル化することはできません...ただし、内部セットを使用してプロパティをシリアル化する可​​能性があります。XML シリアル化アセンブリを生成し、属性XmlSerializerを使用して「フレンド」アセンブリとして宣言する必要があります。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 がプライベート プロパティにアクセスできればよいのですが、残念ながら現在のところ、簡単な方法はありません。

しかし、アーキテクチャ ソリューションには別のオプションがあります。ビジネス ドメインの要件を破壊しないでください。代わりに、aa nTeir 設計と同様にレイヤーを分離し、DTO を実装します...

ビジネス、datafacade/dataadaptor (ファクトリ パターンがここにうまく適合)、および DataAccess レイヤーを 3 つのプロジェクトに分離する場合、ビジネスが DTO について決して知らないことを参照することで制御できます。したがって、シリアライゼーションを削除または実装するか、それを SQL サーバーへの保存に置き換えることにした場合、ビジネス レイヤーには何の影響もありません。

常に 1 つの失敗があり、さらに多くのコードを記述する必要があります: * Dataaccess に移動するエンティティごとに、双方向のオブジェクト コンバーターを作成する必要があります。 dataaccess に進む前に、Dataface で正しい型に変換する必要があります。

nHybinate などを使用すると、これをはるかに簡単に行うことができます。乾杯チョコ

于 2009-11-06T09:12:18.500 に答える