2013-02-11 2 views
6

내 서비스가 다른 방법으로 작동하지만 더 복잡한 컬렉션으로 메소드를 호출하려고하면 서비스 추적 뷰어에서 오류가 발생합니다.WCF 오류 '매개 변수를 직렬화하는 동안 오류가 발생했습니다.'

'http://tempuri.org/:GetDataEventSetResult 매개 변수를 직렬화하는 동안 오류가 발생했습니다. InnerException 메시지가 '데이터 입력 이름이'DAInt : http://schemas.datacontract.org/2004/07/MimosaServerLib '인'MimosaServerLib.DAInt '형식이 아닙니다 ...'

동일한 오류가있는 질문에 대한 답은 클래스 정의를 변경하여 '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와 같은 새로운 파일에 생성 된 코드에 변경 내용을 추가합니다. 이것이 생성 된 코드가 클래스를 부분 클래스로 생성하는 이유입니다. 그래도 문제가 해결되지 않으면

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

는, 당신은 항상 대신 XmlSerializer를 사용하도록 계약을 변경 시도 할 수 있습니다 :

내부 DataEventSet.xsd.nongenerated.cs을, 당신이 뭔가를해야합니다 DataContractSerializer. 그것은 xsd.exe에 의해 생성 된 Xml 속성을 사용하기 때문에 잘 작동합니다.

XmlSerializerFormatter 특성을 서비스 계약에 추가하여 런타임에서 XmlSerializer를 사용하도록 지정할 수 있습니다.

+0

감사합니다. 이제 WCF 테스트 클라이언트에서 작동합니다. 그러나 외부 클라이언트를 사용하여 서비스에 액세스하려고하면 'NetDispatcherFaultException'이 발생합니다 : "http://tempuri.org/:GetDataEventSetResult. InnerException 메시지가 '라인 1 위치 898 오류입니다.'요소 'http : // schemas .datacontract.org/2004/07/MimosaServerLib : DataEvent '이름에 매핑되는 유형의 데이터가 포함되어 있습니다.' – Jimmy

+0

해결 : 서비스 참조 설명서를 업데이트해야합니다. – Jimmy

+0

KnownType() 속성을 사용 했습니까? –

관련 문제