2013-02-11 10 views
6

Моя служба работает для других методов, но когда я пытаюсь вызвать метод с более сложной коллекцией, я получаю сообщение об ошибке (из Service Trace Viewer)Ошибка WCF «Ошибка при попытке сериализации параметра ...»

«При попытке сериализации параметра http://tempuri.org/:GetDataEventSetResult произошла ошибка. Сообщение InnerException было «Тип» MimosaServerLib.DAInt 'с именем контракта данных «DAInt: http://schemas.datacontract.org/2004/07/MimosaServerLib» не ожидается ... »

Ответы на вопросы с той же ошибкой, что и я, связаны с изменением определения класса, чтобы включить off '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; 
    } 

Edit: Определение класса для 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. Это должно хорошо работать, поскольку оно использует атрибуты Xml, созданные xsd.exe.

Вы можете указать, что среда выполнения использует XmlSerializer, добавляя атрибут XmlSerializerFormatter к контракту на обслуживание.

+0

Спасибо! Теперь он работает в тестовом клиенте WCF. Но когда я пытаюсь получить доступ к службе с внешним клиентом, я получаю «NetDispatcherFaultException»: «http://tempuri.org/:GetDataEventSetResult». Сообщение InnerException было «Ошибка в строке 1 позиция 898. Элемент» http: // схемы .datacontract.org/2004/07/MimosaServerLib: DataEvent 'содержит данные от типа, который сопоставляется с именем. " – Jimmy

+0

Решено: необходимо обновить служебную ссылку lol. – Jimmy

+0

Было ли это использование атрибута KnownType()? –

Смежные вопросы