如何在WCF数据协定中包含类实例?

时间:2017-08-10 20:50:14

标签: c# wcf

我正在尝试设置WCF服务,以将有关复杂对象SimCalibrationData的信息传递给客户端。 SimCalibratonData包含SimCalibrationBaseData类型的对象列表。 SimCalibrationBaseData具有SimPlateData类型的对象。所有类都使用[DataContract]进行修饰,公共属性使用[DataMember]进行修饰。如果我将SimPlateData对象包装到List<>中,我可以将它们发送到我的客户端并成功反序列化。如果我不包装它们,我会收到一条错误消息"服务器没有提供有意义的回复"并建议可能存在合同不匹配。

我已经读过,列表和其他收藏品总是可以被序列化和反序列化,但是我还没有找到任何告诉我该做什么如果我不想解决所有问题列表中的数据。

这是我的服务器端代码:

[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)
    {
    }
}

感谢您的帮助。与此同时,我将把所有内容都包装在列表中。

1 个答案:

答案 0 :(得分:0)

蒂姆的第一条评论,指出序列化的属性必须有设置者,是答案。