2013-02-11 38 views
6

私のサービスは他の方法でも動作しますが、もっと複雑なコレクションでメソッドを呼び出そうとすると、サービストレースビューアからエラーが発生しますWCFエラー 'パラメータをシリアル化しようとしてエラーが発生しました...'

'パラメータhttp://tempuri.org/:GetDataEventSetResultをシリアル化しようとしてエラーが発生しました。 InnerExceptionメッセージが 'データ型名' DAInt:http://schemas.datacontract.org/2004/07/MimosaServerLib 'を含む'タイプ 'MimosaServerLib.DAInt'ではありません... '

私が見たのと同じエラーの質問には、 'ProxyCreationEnabled'をオフにしていますが、私が扱っているクラス(DataEventSetDAInt)は、私が与えた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、あなたはこのようなものがあります:問題が解決しない場合、あなたは常にXmlSerializerの代わりに使用する契約を変更してみてください

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

DataContractSerializer。それはxsd.exeによって作成されたXml属性を使用するのでうまくいくはずです。

サービス契約にXmlSerializerFormatter属性を追加することによって、ランタイムがXmlSerializerを使用するように指定できます。

+0

ありがとうございます! WCFテストクライアントで動作します。しかし、私は外部クライアントとのサービスにアクセスしようとすると、私は 'NetDispatcherFaultException': "http://tempuri.org/:GetDataEventSetResult。InnerExceptionメッセージは、 '1行目の位置898エラーです。 .datacontract.org/2004/07/MimosaServerLib:DataEvent 'には、名前にマップされたタイプのデータが含まれています。 – Jimmy

+0

解決済み:サービス参照を更新する必要があります。 – Jimmy

+0

KnownType()属性を使用していましたか? –

関連する問題