将xml反序列化为对象时发生c#错误

将xml反序列化为对象时发生c#错误,c#,xml,deserialization,C#,Xml,Deserialization,我需要测试通过post http请求发送xml的应用程序。所以我把它寄给我自己,试着去实现它。我得到“XML文档(1,2)中有一个错误”。我可以用收到的xml字符串创建XmlDocument,所以xml是正确的。我想我得到了这个例外,因为我从不同的源创建了模式,也就是说,我将我的xml类复制粘贴到另一个应用程序中,使用该应用程序创建了模式,然后从该模式创建了类。现在,我创建了一个简单的服务器,它通过http接收xml,并尝试对其进行反序列化,并在那里复制粘贴生成的类。代码如下: static v

我需要测试通过post http请求发送xml的应用程序。所以我把它寄给我自己,试着去实现它。我得到“XML文档(1,2)中有一个错误”。我可以用收到的xml字符串创建XmlDocument,所以xml是正确的。我想我得到了这个例外,因为我从不同的源创建了模式,也就是说,我将我的xml类复制粘贴到另一个应用程序中,使用该应用程序创建了模式,然后从该模式创建了类。现在,我创建了一个简单的服务器,它通过http接收xml,并尝试对其进行反序列化,并在那里复制粘贴生成的类。代码如下:

static void Main(string[] args)
        {
            HttpListener listener = new HttpListener();
            listener.Prefixes.Add(@"http://127.0.0.1:123/ololo/");
            listener.Start();
            var context = listener.GetContext();
            var xmlstring = string.Empty;

            using (var sr = new StreamReader(context.Request.InputStream))
            {
                xmlstring = sr.ReadToEnd();
            }
            XmlDocument xmlka = new XmlDocument();
            xmlka.LoadXml(xmlstring);
            XmlSerializer serializer = new XmlSerializer(typeof(XmlData));
            MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlstring));
            try
            {
                XmlData resultingMessage = (XmlData)serializer.Deserialize(memStream);
            }
            catch(Exception ex)
            {

            }
        }
堆栈跟踪:

   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
   at ConsoleApplication1.Program.Main(String[] args) in c:\\users\\jamil\\documents\\visual studio 2015\\Projects\\ConsoleApplication1\\ConsoleApplication1\\Program.cs:line 45
InnerException消息:

<XmlData xmlns='http://schemas.datacontract.org/2004/07/Common.Util'> was not expected.
不是预期的。
生成的类中的所有索引如下所示:

   // <auto-generated>
    //     This code was generated by a tool.
    //     Runtime Version:4.0.30319.42000
    //
    //     Changes to this file may cause incorrect behavior and will be lost if
    //     the code is regenerated.
    // </auto-generated>
    //------------------------------------------------------------------------------

    // 
    // This source code was auto-generated by xsd, Version=4.6.1055.0.
    // 


    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
//
//这段代码是由一个工具生成的。
//运行时版本:4.0.30319.42000
//
//对此文件的更改可能会导致不正确的行为,如果
//重新生成代码。
// 
//------------------------------------------------------------------------------
// 
//此源代码由xsd自动生成,版本=4.6.1055.0。
// 
/// 
[System.CodeDom.Compiler.GeneratedCodeAttribute(“xsd”,“4.6.1055.0”)]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(“代码”)]
[System.Xml.Serialization.XmlRootAttribute(Namespace=”“,IsNullable=true)]

让我困惑的是Namespace=“”

您可以尝试在根类中添加名称空间
XmlData

[XmlRoot(ElementName = "XmlData", Namespace = "http://schemas.datacontract.org/2004/07/Common.Util")]

您可以尝试在根类中添加名称空间
XmlData

[XmlRoot(ElementName = "XmlData", Namespace = "http://schemas.datacontract.org/2004/07/Common.Util")]


粘贴您的XML文件。
program.cs
的第45行是什么?@Ivan,XmlData resultingMessage=(XmlData)序列化程序。反序列化(memStream)@Aybe,150kb,我可以发送给你粘贴你的XML文件。
program.cs
第45行是什么?@Ivan,XmlData resultingMessage=(XmlData)serializer.反序列化(memStream)@Aybe,150kb,我可以寄给你谢谢,成功了。但是如何将名称空间包含到.xsd文件中?如果您有一个具有名称空间的xml文件,则可以使用:
xsd xmldata.xml
创建
.xsd
fileNo,我按照指南创建了带有类的.dll文件,然后运行xsd myfile.dll,然后xsd schema0.xsd/classesI定义了dll的命名空间,该命名空间与在生产环境中存储类的命名空间相同,但它没有帮助在类中使用属性
XmlRoot
xmldattribute
xmlement
,它应该可以工作。谢谢,它工作了。但是如何将名称空间包含到.xsd文件中?如果您有一个具有名称空间的xml文件,则可以使用:
xsd xmldata.xml
创建
.xsd
fileNo,我按照指南创建了带有类的.dll文件,然后运行xsd myfile.dll,然后xsd schema0.xsd/classesI定义了dll的名称空间,该名称空间与在生产环境中存储类的名称空间相同,但它没有帮助在类中使用属性
XmlRoot
xmldattribute
xmlement
,它应该可以工作。