我的服务适用于其他方法但是当我尝试调用具有更复杂集合的方法时,我得到错误(来自Service Trace Viewer)
‘尝试序列化参数http://tempuri.org/:GetDataEventSetResult时出错.InstallException消息是’Type’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; } }
}
解决方法
我认为您需要将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.