2012-02-28 9 views
1

ネットの99%を検索した後も、次のことに取り組んでいます。私は、パートナー企業が提供するwsdlに従わなければならないWebサービスを持っています。このサービスのメソッドを呼び出すと、(複雑な)クラスが生成されます。サービスが呼び出されると、残念なことにシリアル化エラーが発生します。クラスオブジェクトを配列でいっぱいにしてクラスをシリアライズする方法

私は問題を特定しましたが、解決策を考えることはできません。私は提供されたwsdlに依存しているので、複雑なクラス構造を変更することはできません。誰もが私が逃していることを知ってほしいと思う。エラーがメソッドSerializeを()を呼び出した後上がるキャッチ/お試しで

[System.SerializableAttribute()] 
public class MyObject 
{ 
    public int Id { get; set; } 
    public object Item { get; set; } // <---- Note type *object* here 
} 

[System.SerializableAttribute()] 
public class MyItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

[TestClass] 
public class SerializationTest 
{ 
    [TestMethod] 
    public void Serializing() 
    { 
     MyObject myObject = new MyObject { Id = 1 }; 
     myObject.Item = new MyItem[] { new MyItem { Id = 1, Name = "Test" } }; 

     string serializedString = SerializeObjectToXmlString(myObject, new []{ typeof(MyItem)}); 

     Assert.IsFalse(String.IsNullOrWhiteSpace(serializedString)); 
    } 

    /// <summary> 
    /// This method serializes objects to an XML string using the XmlSerializer 
    /// </summary> 
    private static string SerializeObjectToXmlString(object theObject, Type[] types) 
    { 
     using (var oStream = new System.IO.MemoryStream()) 
     { 
      var oSerializer = new System.Xml.Serialization.XmlSerializer(theObject.GetType(), types); 

      oSerializer.Serialize(oStream, theObject); // <- Here the error is raised 

      return System.Text.Encoding.Default.GetString(oStream.ToArray()); 
     } 
    } 
} 

:ここに私の問題を再現するサンプルコードです。このエラーの詳細は次のとおりです。

InvalidOperationException was unhandled by user code 
- There was an error generating the XML document. 
    The type MyItem[] may not be used in this context. 

私の開発コンテキストは、Visual Studio 2010、.Net Framework 3.5で構成されています。

編集#1:追加シリアル化属性が、エラーが

答えて

0

あなたはあなたが行う必要があります

[Serializable] 
public class MyObject 
{ 
    public int Id { get; set; } 
    public MyItem[] Item { get; set; } // <---- Note type *object* here 
} 

[Serializable] 
public class MyItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

シリアル化にUnknownオブジェクト(項目 MyObjectにクラスの)として、あなたのクラスをマークする必要がありますremaines ISerializableおよびIDeserializationCallbackMyObjectクラスに追加された適切なインターフェイスを手動で実装します。

+0

はい、そうです。私はそれらの属性を追加する必要があります。私は私の例でそれらを追加することを忘れましたが、私のreallifeのコードでそれらを持っています。残念ながら、これでは問題は解決しません。上記のコード例を更新します。 –

+0

私はこの問題がMyObject宣言にあると思います。 'public object Item'を' public MyItem [] Item'に変更してください。 – Marcin

+0

はい、それは複雑さを生成します。唯一の問題は、クラス構造がwsdlから生成されるため、変更できないことです。また、 'object'は私の例では' MyItem [] 'を含んでいますが、他の2つの(より単純な)型を含むことができなければなりません。 –

1

objectに型の配列を追加してシリアル化することはできないようです。解決策は、名前が言うように、配列を含むコンテナクラスを作成することでした。この方法で、コンテナクラスをobjectに割り当てて、すべてをシリアル化することができます。

私の場合に加えて、コンテナクラスはobjectに配列を追加する技術的な解決策に過ぎないので、私はwsdl.exeユーティリティによって作成されたオブジェクトモデルに誤解を感じました。このコンテナクラスも作成され、すべてがすでに使用されていました。私のカスタムコンテナクラスを試してみた後、私はすでに作成されたコンテナクラスに気付きました。残念ながら、この問題で多くの時間を惜しみました...

関連する問題