C# 反序列化对象与源不相同

C# 反序列化对象与源不相同,c#,.net,xml,xsd,xmlserializer,C#,.net,Xml,Xsd,Xmlserializer,我在反序列化以前序列化的XML时遇到问题 我的类是由xsd.exe实用程序从.xsd生成的。我对.xsd的结构没有影响,因为它是由政府发布的,用于规范通信 问题是,当我创建一个对象,设置它的一些属性,然后使用XmlSerializer对它进行序列化,然后再反序列化回来时,我得到的“内容”与我开始时不一样。XML中的某些元素在“Any”属性中进行反序列化,而不是在最初序列化这些元素的属性中进行反序列化 也许这是一个笨拙的解释,但我已经创建了一个复制我的问题的示例项目。 样本项目可以找到 编辑: 好

我在反序列化以前序列化的XML时遇到问题

我的类是由xsd.exe实用程序从.xsd生成的。我对.xsd的结构没有影响,因为它是由政府发布的,用于规范通信

问题是,当我创建一个对象,设置它的一些属性,然后使用XmlSerializer对它进行序列化,然后再反序列化回来时,我得到的“内容”与我开始时不一样。XML中的某些元素在“Any”属性中进行反序列化,而不是在最初序列化这些元素的属性中进行反序列化

也许这是一个笨拙的解释,但我已经创建了一个复制我的问题的示例项目。 样本项目可以找到

编辑: 好的,下面是一些示例代码。不幸的是,我不能在这里粘贴所有内容,因为xsd.exe生成的文件超过4000行。但所需的一切都在链接文件中

我的测试控制台应用程序:

    static void Main(string[] args)
    {
        Pismeno pismeno = new Pismeno();

        #region Build sample content
        pismeno.Sadrzaj = new SadrzajTip();
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml("<SomeXml xmlns=\"http://some.namespace.com/\">Some content goes here</SomeXml>");
        pismeno.Sadrzaj.Item = xmlDoc.DocumentElement;

        pismeno.Prilog = new PismenoPrilog[1];
        pismeno.Prilog[0] = new PismenoPrilog();
        pismeno.Prilog[0].VrijemeNastanka = DateTime.Now.ToString("s");

        XmlDocument xmlTitle = new XmlDocument();
        xmlTitle.LoadXml("<Title xmlns=\"http://some.namespace.com/\">Test title 1</Title>");
        pismeno.Prilog[0].Any = new XmlElement[1];
        pismeno.Prilog[0].Any[0] = xmlTitle.DocumentElement;

        pismeno.Prilog[0].Sadrzaj = new SadrzajTip();
        EAdresaTip eat = new EAdresaTip();
        eat.URL = "http://www.example.com/testfile.doc";
        pismeno.Prilog[0].Sadrzaj.Item = eat;
        #endregion

        // Serialize object, and then deserialize it again
        string pismenoSer = Serialize(pismeno);
        Pismeno pismeno2 = Deserialize<Pismeno>(pismenoSer);

        // Objects to compare. "source" has source.Sadrzaj and source.Prilog properties set
        // "shouldBeTheSameAsSource" has shouldBeTheSameAsSource.Any property set
        Pismeno source = pismeno;
        Pismeno shouldBeTheSameAsSource = pismeno2;
    }

    public static string Serialize(object o)
    {
        string ret = null;

        using (var stream = new MemoryStream())
        {
            XmlWriter xw = new XmlTextWriter(stream, Encoding.UTF8) { Formatting = Formatting.Indented };

            new XmlSerializer(o.GetType()).Serialize(xw, o);
            stream.Flush();
            stream.Seek(0, SeekOrigin.Begin);

            ret = (new StreamReader(stream, Encoding.UTF8)).ReadToEnd();
        }

        return ret;
    }

    public static T Deserialize<T>(string xml)
    {
        return (T)new XmlSerializer(typeof(T)).Deserialize(XmlReader.Create(new StringReader(xml)));
    }
static void Main(字符串[]args)
{
Pismeno Pismeno=新Pismeno();
#区域构建示例内容
pismeno.Sadrzaj=新的SadrzajTip();
XmlDocument xmlDoc=新的XmlDocument();
LoadXml(“这里有一些内容”);
pismeno.Sadrzaj.Item=xmlDoc.DocumentElement;
pismeno.Prilog=新的PismenoPrilog[1];
pismeno.Prilog[0]=新的PismenoPrilog();
pismeno.Prilog[0].VrijemeNastanka=DateTime.Now.ToString(“s”);
XmlDocument xmlTitle=新的XmlDocument();
加载XML(“测试标题1”);
pismeno.Prilog[0].Any=新的XmlElement[1];
pismeno.Prilog[0]。任意[0]=xmltTitle.DocumentElement;
pismeno.Prilog[0].Sadrzaj=new-SadrzajTip();
EAdresaTip eat=新EAdresaTip();
eat.URL=”http://www.example.com/testfile.doc";
pismeno.Prilog[0].Sadrzaj.Item=eat;
#端区
//序列化对象,然后再次反序列化它
字符串pismenoSer=Serialize(pismeno);
Pismeno pismeno2=反序列化(pismenoSer);
//要比较的对象。“source”设置了source.Sadrzaj和source.Prilog属性
//“shouldbethesameasource”具有shouldbethesameasource。任何属性集
Pismeno源=Pismeno;
Pismeno应为ESAMEASSOURCE=pismeno2;
}
公共静态字符串序列化(对象o)
{
字符串ret=null;
使用(var stream=new MemoryStream())
{
XmlWriter xw=newXMLTextWriter(stream,Encoding.UTF8){Formatting=Formatting.Indented};
新的XmlSerializer(o.GetType()).Serialize(xw,o);
stream.Flush();
stream.Seek(0,SeekOrigin.Begin);
ret=(新的StreamReader(stream,Encoding.UTF8)).ReadToEnd();
}
返回ret;
}
公共静态T反序列化(字符串xml)
{
返回(T)新的XmlSerializer(typeof(T));
}

您必须显示一些代码。很少有人会盲目地关注您发布的链接。您是否在Pismeno类型中使用XmlAnyElementAttribute定义了Any属性?是的,生成的代码块如下所示:`//[System.Xml.Serialization.XmlAnyElementAttribute()]public System.Xml.XmlElement[]任意{get{return this.anyField;}set{this.anyField=value;}}`