7

私のサービスは他のメソッドでも機能しますが、より複雑なコレクションでメソッドを呼び出そうとすると、エラーが発生します(Service Trace Viewerから)

'パラメータ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;
    }
}

}

4

1 に答える 1

8

ポリモーフィックな方法で使用しているため、クラスに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 を使用するように指定できます。

于 2013-02-11T15:20:50.080 に答える