2009-06-18 8 views
4

SOAPシリアル化で問題が発生しました。ここでは非常に簡単な例です:私は、メソッドのテスト()を実行した場合複合型のSOAPシリアル化中にInvalidOperationExceptionが発生しました

public void Test() 
{ 
    StringBuilder sb = new StringBuilder(); 
    StringWriter writer = new StringWriter(sb); 

    SoapReflectionImporter importer = new SoapReflectionImporter(); 
    XmlTypeMapping map = importer.ImportTypeMapping(typeof(A)); 
    XmlSerializer serializer = new XmlSerializer(map); 
    serializer.Serialize(writer, new A()); 
} 

[Serializable] 
public class A 
{ 
    public A() 
    { 
     BB = new B(); 
    } 

    public int a; 

    public B BB; 
} 
[Serializable] 
public class B 
{ 
    public int A1 { get; set; } 

    public int A2 { get; set; } 
} 

その後、私は次の例外を取得:System.InvalidOperationException: Token StartElement in state Epilog would result in an invalid XML document.

は、任意のヘルプをお願い申し上げます。

答えて

3

StringWriterの代わりにXmlWriterを使用し、writer.WriteStartElement( "root");を実行します。

これは動作します:

Stream s = new MemoryStream(); 
XmlWriter writer = new XmlTextWriter(s, Encoding.UTF8); 

SoapReflectionImporter importer = new SoapReflectionImporter(); 
XmlTypeMapping map = importer.ImportTypeMapping(typeof(A)); 
XmlSerializer serializer = new XmlSerializer(map); 
writer.WriteStartElement("root"); 
serializer.Serialize(writer, new A()); 

StreamReader sr = new StreamReader(s); 
string data = sr.ReadToEnd(); 
+0

ありがとうございます。しかし、私は別の問題を抱えています。今回は荒廃します。 クラスAのメソッドGetHashCode()をオーバーライドしてプロパティBBにアクセスしようとすると、逆シリアル化中にNullReferenceExceptionが表示されます。何とかプロパティBBは0に等しいですが、そうではありません。 –

+0

デシリアライゼーションコードを投稿できますか?私は見ていますよ –

+0

さて、私は問題をローカライズしました。 Deserializator自体はかなり奇妙な動作をします。デフォルトのコンストラクタを呼び出すことによって非直列化クラスの新しいインスタンスを作成し、その後、すべてのフィールドとプロパティを手動でデフォルト値に設定します。つまり、参照型のプロパティをnullに設定します。そして、deserializatorはGetHashCode()やEquals()のようなメソッドを呼び出します。しかし、これらのメソッドの自分自身の実現は、プロパティが決してnullにならないことを "知っている"。それは例外を引き起こした。私はGetHashCode()とEquals()でコードを変更しましたが、今ではプロパティがnullになることを "知っています"。手伝ってくれてありがとう! –

5

ストリームの位置がストリームの先頭に設定されていない場合だけ、ノート、 上の例は動作しません。そうですね:

Stream s = new MemoryStream(); 
XmlWriter writer = new XmlTextWriter(s, Encoding.UTF8); 

SoapReflectionImporter importer = new SoapReflectionImporter(); 
XmlTypeMapping map = importer.ImportTypeMapping(typeof(A)); 
XmlSerializer serializer = new XmlSerializer(map); 
writer.WriteStartElement("root"); 
serializer.Serialize(writer, new A()); 

s.Position = 0; 
StreamReader sr = new StreamReader(s); 
string data = sr.ReadToEnd(); 
+0

ありがとう、私は読書を続けてうれしい。私はデータのための空の文字列を取得していたが、これを見た後に動作します! –

+0

ライフセーバー!これは完了したとしても受け入れられるべきです。 – Harsh