シリアル化されていないオブジェクトがあり、ソース コードにアクセスできません。WCF を使用してネットワーク経由で送信できるようにシリアライズ可能にするオプションは何ですか?
オブジェクトが直列化できない重大な理由はありません。クラスの作成者がそのようにマークしなかったため、クラスはシリアライズ可能ではなく、私はクラスにアクセスできません。
シリアル化されていないオブジェクトがあり、ソース コードにアクセスできません。WCF を使用してネットワーク経由で送信できるようにシリアライズ可能にするオプションは何ですか?
オブジェクトが直列化できない重大な理由はありません。クラスの作成者がそのようにマークしなかったため、クラスはシリアライズ可能ではなく、私はクラスにアクセスできません。
これをチェックしてください:
public class Base
{
public string Name { get; set; }
public List<int> Values { get; set; }
}
[Serializable]
public class Derived : Base
{
public double X { get; set; }
}
class Program
{
static void Main(string[] args)
{
var d = new Derived() { X = 3.1415, Values = new List<int> { 3, 1, 4, 1, 5 }, Name = "Pi" };
var stream = new MemoryStream();
new XmlSerializer(typeof(Derived)).Serialize(stream, d);
string result = Encoding.UTF8.GetString(stream.GetBuffer());
}
}
どうやら、派生クラスをシリアライズ可能にすることができます。結果の文字列には、基本クラスのプロパティの値も含まれます。
クラスが最初からシリアル化を念頭に置いて作成されていない場合は、データ コントラクトである単純なDTOクラスを作成し、データをそのクラスにコピーすることをお勧めします。多くのプロパティがある場合、コピーを容易にするためにAutomapperを使用できます。
プロトコル コントラクト (WCF データ コントラクト クラス) を別のクラスに分離することを常にお勧めします。変更するとサービスのクライアントが壊れるため、変更のタイミングと方法を厳密に制御できます。
他のコードを変更することはできないため、「プロキシ」を作成する必要があります。
対象のプロパティを含む基本的な DTO/POCO オブジェクトにすることができます。
アンダースはすでにこれを言っていました。
ここに「パターン」へのリンクがあります
http://www.dofactory.com/Patterns/PatternProxy.aspx
これは、wcf の概念に直結するものではありません。リンクは、「思考の糧」を提供するために提供されています。
[Serializable] オブジェクトと元のオブジェクトの間に基本的な「トランスレータ」を記述できます。