复杂类型的SOAP序列化时出现InvalidOperationException

时间:2009-06-18 08:39:36

标签: c# .net serialization soap

我遇到了SOAP序列化的问题,找到答案会很棒。这是一个非常简单的例子:

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; }
}

如果我运行方法Test(),那么我得到以下异常:System.InvalidOperationException: Token StartElement in state Epilog would result in an invalid XML document.

感谢任何帮助。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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();