2013-02-11 69 views
6

我的服務適用於其他方法,但是當我嘗試調用具有更復雜集合的方法時,我得到錯誤(來自服務跟蹤查看器)WCF錯誤'嘗試序列化參數時出錯'

'嘗試序列化參數http://tempuri.org/:GetDataEventSetResult時發生錯誤。 InnerException消息是'鍵入'MimosaServerLib.DAInt'與數據契約名稱'DAInt:http://schemas.datacontract.org/2004/07/MimosaServerLib'不是預期的...'

回答的問題與我見過的同一錯誤涉及更改類定義關閉'ProxyCreationEnabled',但我正在使用的類(DataEventSet,DAInt)來自使用我已經給出的xsd工具自動生成的文件。即我不應該改變它。

我創建DataEventSet對象,這是暴露的,就像這樣:

private DataEventSet CreateDataEventSet() 
    { 
     DataEventSet aDataEventSet = new DataEventSet(); 
     DataEvent[] dataEvents = new DataEvent[2]; 
     DAInt aDAInt = new DAInt(); 
      aDAInt.id = 100100100; 
      aDAInt.value = 1; 
      dataEvents[0] = aDAInt; 
     DADataSeq aDADataSeq = new DADataSeq(); 
      aDADataSeq.id = 200100100; 
      double[] vals = new double[2]; 
       vals[0] = 5; 
       vals[1] = 44; 
      aDADataSeq.values = vals; 
      double[] vals2 = new double[2]; 
       vals2[0] = 1; 
       vals2[1] = 1; 
      aDADataSeq.xAxisDeltas = vals2; 
      aDADataSeq.xAxisStart = 0; 
      dataEvents[1] = aDADataSeq; 
     aDataEventSet.id = 0; 
     Site aSite = new Site(); 
      aSite.category = SITE_CATEGORY.SITE_SPECIFIC; 
     aDataEventSet.site = aSite; 
     OsacbmTime aTime = new OsacbmTime(); 
      aTime.tick_time = 12313246; 
      aTime.time = "2007-09-20T14:46:04.123"; 
      aTime.time_type = OsacbmTimeType.OSACBM_TIME_MIMOSA; 
     aDataEventSet.time = aTime; 
     aDataEventSet.dataEvents = dataEvents; 

     return aDataEventSet; 
    } 

編輯:的DataEventSet

//This source code was auto-generated by xsd 

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.mimosa.org/OSACBMV3-1l")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.mimosa.org/OSACBMV3-1l", IsNullable=false)] 
public partial class DataEventSet { 

private bool alertStatusField; 

private bool alertStatusFieldSpecified; 

private DataEvent[] dataEventsField; 

private ulong idField; 

private Site siteField; 

private OsacbmTime timeField; 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public bool alertStatus { 
    get { 
     return this.alertStatusField; 
    } 
    set { 
     this.alertStatusField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool alertStatusSpecified { 
    get { 
     return this.alertStatusFieldSpecified; 
    } 
    set { 
     this.alertStatusFieldSpecified = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("dataEvents", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public DataEvent[] dataEvents { 
    get { 
     return this.dataEventsField; 
    } 
    set { 
     this.dataEventsField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public ulong id { 
    get { 
     return this.idField; 
    } 
    set { 
     this.idField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public Site site { 
    get { 
     return this.siteField; 
    } 
    set { 
     this.siteField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public OsacbmTime time { 
    get { 
     return this.timeField; 
    } 
    set { 
     this.timeField = value; 
    } 
} 

}

回答

6

類定義,我認爲你需要將KnownType(typeof(DAInt))屬性添加到DataEventSet類,因爲您正在以多態方式使用它。我通常將所做的更改添加到名爲DataEventSet.xsd.nongenerated.cs的新文件中。這就是生成的代碼將類創建爲部分類的原因。

裏面DataEventSet.xsd.nongenerated.cs,你就會有這樣的事情:

[KnownType(typeof(DAInt))] 
public partial class DataEventSet { 
} 

如果不工作,那麼你可以嘗試改變合同使用XmlSerializer代替DataContractSerializer。這應該很好,因爲它使用由xsd.exe創建的Xml屬性。

您可以通過將XmlSerializerFormatter屬性添加到服務協定來指定運行時使用XmlSerializer。

+0

謝謝!它現在在WCF測試客戶端中工作。但是,當我嘗試訪問與外部客戶端服務時,我得到一個'NetDispatcherFaultException':「http://tempuri.org/:GetDataEventSetResult。InnerException消息是'錯誤行1位置898.元素'http://架構.datacontract.org/2004/07/MimosaServerLib:DataEvent'包含映射到名稱的類型的數據。「 – Jimmy 2013-02-11 15:35:48

+0

解決:需要更新服務引用lol。 – Jimmy 2013-02-11 15:40:19

+0

是否使用KnownType()屬性? – 2013-02-11 15:43:24

相關問題