首页 文章

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

提问于
浏览
1

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

我已经读过列表和其他集合总是可以序列化和反序列化,但是如果我不想在列表中包装所有数据的麻烦,我还没有发现任何告诉我该怎么做的事情 .

这是我的服务器端代码:

[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

    蒂姆的第一个评论指出,序列化的属性必须有定位器,是答案 .

相关问题