2009-06-18 37 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

使用XmlWriter代替StringWriter並執行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,但它不應該。 – 2009-06-18 09:58:01

+0

你可以發佈你的反序列化代碼嗎?我會看看 – 2009-06-18 12:09:55

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(); 
相關問題