Serialize我的自定义数据表时的ContractException

时间:2011-05-27 07:58:20

标签: wcf serialization datatable

尝试执行此wcf代码时出现错误

  

ExceptionDetail,可能由IncludeExceptionDetailInFaults = true创建,其值为:   System.InvalidOperationException:在对WSDL导出扩展的调用中抛出异常:System.ServiceModel.Description.DataContractSerializerOperationBehavior    合同:http://tempuri.org/:IService1 ----> System.Runtime.Serialization.InvalidDataContractException:方法'MyClassLibrary.MyDataTable.GetSchema()'必须返回具有有效Id的模式。      在System.Runtime.Serialization.SchemaExporter.InvokeGetSchemaMethod(键入clrType,XmlSchemaSet架构,XmlQualifiedName stableName)      在System.Runtime.Serialization.SchemaExporter.ExportXmlDataContract(XmlDataContract dataContract)      在System.Runtime.Serialization.SchemaExporter.ExportDataContract(DataContract dataContract)      在System.Runtime.Serialization.SchemaExporter.Export()      在System.Runtime.Serialization.XsdDataContractExporter.Export()      在System.Runtime.Serialization.XsdDataContractExporter.Export(Type type)      at System.ServiceModel.Description.MessageContractExporter.ExportType(Type type,String partName,String operationName,XmlSchemaType& xsdType)      在System.ServiceModel.Description.DataContractSerializerMessageContractExporter.ExportBody(Int32 messageIndex,Object state)      在System.ServiceModel.Description.MessageContractExporter.ExportMessage(Int32 messageIndex,Object state)   ....   ...   ....

自定义数据表

Public Class MyDataTable
    Inherits DataTable

    Public Sub New()
    End Sub

 End Class

我的WCF界面

 <ServiceContract()> _
 Public Interface IService1
   <OperationContract()> _
   Function TestDatatable(ByVal MyDT As MyDataTable) As Boolean
End Interface

实施

Public Class Service1
  Implements IService1

    Public Function TestDatatable(ByVal MyDT As MyClassLibrary.MyDataTable) As Boolean Implements IService1.TestDatatable

          Return MyDT.TableName = "MyTable"

     End Function
End Class

注意:当只使用数据表时它可以,但不是我的自定义数据表。

需要添加什么?我可以序列化我的自定义数据表。 我能够序列化我的其他对象而不是这个类。

2 个答案:

答案 0 :(得分:0)

我不是手动从DataTable派生,而是使用Visual Studio的数据集设计器创建一个类型化的数据集。它们更容易使用。

答案 1 :(得分:0)

DataTable中GetSchema方法的实现类似于

protected virtual XmlSchema GetSchema()
    {
      if (this.GetType() == typeof (DataTable))
        return (XmlSchema) null;

这样你就可以用以下方式覆盖这个方法

protected override XmlSchema GetSchema()
{
    return null;
}

这将解决序列化问题。