c# - WCF 错误 'There was an error while trying to serialize parameter...'

标签 c# wcf web-services serialization

我的服务适用于其他方法,但是当我尝试调用具有更复杂集合的方法时,出现错误(来自服务跟踪查看器)

'尝试序列化参数时出错 http://tempuri.org/:GetDataEventSetResult . InnerException 消息是“键入‘MimosaServerLib.DAInt’,数据协定名称为‘DAInt:http://schemas.datacontract.org/2004/07/MimosaServerLib” '预计不会...'

我看到的具有相同错误的问题的答案涉及更改类定义以关闭“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;
    }
}

最佳答案

我认为您需要将 KnownType(typeof(DAInt)) 属性添加到 DataEventSet 类,因为您正在以多态方式使用它。我通常会在名为 DataEventSet.xsd.nongenerated.cs 的新文件中添加对生成代码的更改。这就是生成的代码将类创建为分部类的原因。

在 DataEventSet.xsd.nongenerated.cs 中,您将拥有如下内容:

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

如果这不起作用,那么您始终可以尝试更改契约(Contract)以使用 XmlSerializer 而不是 DataContractSerializer。这应该能很好地工作,因为它使用由 xsd.exe 创建的 Xml 属性。

您可以通过添加 XmlSerializerFormatter 来指定运行时使用 XmlSerializer属性到服务契约(Contract)。

关于c# - WCF 错误 'There was an error while trying to serialize parameter...',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814379/

相关文章:

c# - 调用 Label.Text(在 C# 中)与 Label.innerHTML 导致意外结果

c# - DependencyObject 找不到目标元素的管理 FrameworkElement,即使该对象位于 FrameworkElement 的逻辑树中

c# - W3C (IIS) 日志记录不记录我的 WCF 服务的 ClaimsIdentity 用户名

javascript - 为什么 WCF 服务无法在托管服务器上运行?

c# - 实例化 Web 服务时的最佳做法是什么

c# - 使用 x509 证书保护 .svc 网络服务

c# webbrowser从文本框中获取其url

c# - 浮点差异取决于调试构建的运行方式

java - Mirth:使用客户端证书调用 SSL SOAP Web 服务

asp.net - WCF REST 服务模板 40 和 JSON 格式的 Entity Framework 返回空响应