複雑なオブジェクトSimCalibrationDataに関する情報をクライアントに渡すためにWCFサービスを設定しようとしています。 SimCalibratonDataには、SimCalibrationBaseData型のオブジェクトのリストが含まれています。 SimCalibrationBaseDataにはSimPlateData型のオブジェクトがあります。すべてのクラスは[DataContract]で装飾され、パブリックプロパティは[DataMember]で装飾されています。 SimPlateDataオブジェクトをリスト<にラップすると、それらをクライアントに送信することができ、それらは正常に逆シリアル化されます。私がそれらをラップしないと、「サーバーが意味のある返答をしていない」というエラーが表示され、契約の不一致がある可能性があります。WCFデータコントラクトにクラスインスタンスを含めるにはどうすればいいですか?
私はそのリストを読んでいて、他のコレクションは常にシリアル化され、デシリアライズできますが、リスト内のすべてのデータをラップするのは難しい場合には何をすべきか分かりません。ここで
は私のサーバー側のコードです:
[DataContract]
public class SimCalibrationData
{
private List<SimBaseCalibrationData> m_baseCalibrations = new List<SimBaseCalibrationData>();
[DataMember]
public List<SimBaseCalibrationData> BaseCalibrations
{
get { return m_baseCalibrations; }
}
public SimCalibrationData(CSimThermalCalibrationList calibrationList)
{
foreach (CSimThermalCalibration calibration in calibrationList.Listing)
{
m_baseCalibrations.Add(new SimBaseCalibrationData(calibration));
}
}
}
[DataContract]
[KnownType(typeof(SimPlateData))]
public class SimBaseCalibrationData
{
// Plate Parameters
SimPlateData m_convectorPlate;
[DataMember]
public SimPlateData ConvectorPlate
{
get { return m_convectorPlate; }
}
SimPlateData m_loadPlate;
[DataMember]
public SimPlateData LoadPlate
{
get { return m_loadPlate; }
}
public SimBaseCalibrationData(CSimThermalCalibration calibration)
{
m_convectorPlate = new SimPlateData(calibration.ConvectorPlate);
m_loadPlate = new SimPlateData(calibration.LoadPlate);
}
}
[DataContract]
public class SimPlateData
{
public SimPlateData(CSimPlate plate)
{
}
}
はあなたの助けをいただき、ありがとうございます。その間に、私はリストのすべてをラップします。
DataContractsに関する注釈。まず、直列化したい各プロパティはgetとsetの両方を持つ必要があります。そうでなければ直列化は失敗します(セッターなしでは、送信側が値を直列化する方法はありません)。第2に、クライアントとサービスの間でデータコントラクトを持つアセンブリを共有していない限り、メソッドとコンストラクタはシリアライズ可能ではないため、何も役に立ちません。データのみが表示されます。 – Tim
ご返信ありがとうございます。私はシリアル化中に何が起こっているのか理解していません。サーバー側には、本番データから送信されるオブジェクトに変換するコンストラクタがあります。それは私のデータメンバーを初期化します。しかし、あなたは、シリアル化が私のオブジェクトのコピーを作成し、コンストラクタを呼び出さずにパブリックデータメンバーをコピーすると言っているのですか? (実際にはおなじみのように聞こえますが、私はどこかでそれを読むことを覚えているようです。) –
はい、それは私の理解と経験に基づいて正しいです。すべてのDataContractは、システムにDataContractSerializerを使用するよう指示します。これは、 '[DataMember]'でマークされたすべてのプロパティをシリアル化します。コンストラクタとメソッドはシリアル化されず、または送信されません。これはSOAの原則です。実装はクライアントに委ねられます。 – Tim