WCFでパラメータレスコンストラクタなしでオブジェクトをシリアル化することは可能ですか?
-
03-07-2019 - |
質問
プライベートのパラメーターレスコンストラクターが機能することは知っていますが、パラメーターレスコンストラクターのないオブジェクトはどうですか?
型定義を制御できないように、サードパーティライブラリから型を公開したい。
最も簡単な方法がありますか?例えば。サブタイプを作成する必要はありません。
編集:
探しているのは、ここに示すカスタマイズのレベルのようなものです: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx ただし、シリアル化/逆シリアル化するためにストリームに頼る必要はありません。
解決
実際には、任意の型をシリアライズ可能にすることはできません。場合によっては( XmlSerializer
など)、ランタイムは属性をスプーフィングするオプションを公開します。しかし、 DataContractSerializer
はこれを許可しません。実行可能なオプション:
- シリアライズ可能な (多くの作業)独自の型の背後にあるクラスを非表示にします
- バイナリフォーマッタサロゲートを提供します(はい)
- 独自のシリアライゼーションコアを作成します(適切に処理するには多くの作業が必要です)
本質的に、何かがシリアライズ用に設計されていない場合、フレームワークのほとんどはあなたがそれをシリアライズすることをできません。
他のヒント
私はWCFの専門家ではありませんが、任意の型のコンストラクターでのシリアル化をサポートしているとは考えられません。つまり、値に何を渡すのでしょうか?参照型にはnullを、構造体には空の値を渡すことができます。しかし、完全に空のデータで構築できる型はどのようなものでしょうか?
2つのオプションのうち1つにこだわっていると思います
- 問題の型のサブクラスを作成し、適切なデフォルト値をパラメータなしのコンストラクタに渡します
- 直列化のために存在する型を作成します。完了すると、興味のある元のタイプのインスタンスを作成できます。これは、一種の橋渡しです。
個人的に私は#2に行きます。クラスをデータのみの構造にし、シリアル化とファクトリー目的のために最適化します。
デフォルトのコンストラクタを持たない基本オブジェクトを返すWCFサービスを使用して、ちょっとしたテストを実行しました。
//[DataContract]
//[Serializable]
public class MyObject
{
public MyObject(string _name)
{
Name = _name;
}
//[DataMember]
public string Name { get; set; }
//[DataMember]
public string Address { get; set; }
}
サービスは次のようになります。
public class MyService : IMyService
{
#region IMyService Members
public MyObject GetByName(string _name)
{
return new MyObject(_name) { Address = "Test Address" };
}
#endregion
}
MyObjectが[DataContract]または[Serializable]である限り、これは実際に機能します。興味深いことに、クライアント側でデフォルトのコンストラクタを必要としないようです。ここに関連する投稿があります: