2009-06-18 78 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();