在反序列化之前,如何在C#中确定XML序列化对象的类?

时间:2017-06-04 14:19:59

标签: c# xml serialization

我有一个服务器接受请求作为XML序列化对象,可以是10个不同的类中的任何一个。当然,为了使服务器处理请求,它必须首先将XML字符串反序列化为对象。要做到这一点,它需要知道对象来自哪个类来选择正确的反序列化器并重新构造对象。因此,在尝试对其进行反序列化以获取对象类型然后选择适当的反序列化器之前,能够快速检查XML字符串是一件好事。

我一直在使用以下代码,但是,就像这首歌一样,“我知道必须有更好的方法......”任何建议或见解都会受到赞赏。

 private void button1_Click(object sender, EventArgs e)
    {
        //any class - does not matter - create an object
        SomeClass tc = new SomeClass();
        //populate it
        tc.i = 5;
        tc.s = "Hello World";
        tc.d = 123.456;

        //Serialize it to XML
        StringWriter xml = new StringWriter();
        System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(SomeClass));
        x.Serialize(xml, tc);

        //Extract the Class name and show the XML to the user without de-serializing it
        textBox1.Text = GetClassNameFromXMLSerializedString(xml.ToString());
    }

    private string GetClassNameFromXMLSerializedString(string xml)
    {
        //The class name is somewhere in the xml
        string classname = xml;
        //get the start of class name
        classname = xml.Substring(classname.IndexOf('>') + 4);
        //get the class name which is terminated by a space
        classname = classname.Substring(0, classname.IndexOf(' '));
        //return it
        return classname;
    }

2 个答案:

答案 0 :(得分:0)

XML反序列化器在反序列化之前不需要知道它是什么类型。 MSDN Article about the Deserialize method有一些有用的信息,当然它有一个代码片段,我在下面提到。

我认为您可能会对服务器将其反序列化为对象这一事实感到困惑,但后来不知道如何处理它。您可以随时为switch case方法的结果执行ReturnedObject.GetType(),并计算出您需要执行的操作。

你可以将它序列化为这样的对象:

 var ReturnedObject = XMLSerializer.Deserialize(reader); 

然后你可以继续做

 switch (ReturnedObject.getType())
 {
     case MyClass:
         // Insert code here 
     case AnotehrClass:
         //Do something else here for another class
 }

答案 1 :(得分:0)

如果你真的想要,你可以阅读第三个元素:

using (XmlReader xr = XmlReader.Create(GenerateStreamFromString(xml.ToString())))
{
    xr.Read();
    xr.Read();
    xr.Read();

    textBox1.Text =  xr.Name;
}

使用此辅助函数:

public static MemoryStream GenerateStreamFromString(string value)
{
    return new MemoryStream(Encoding.Unicode.GetBytes(value ?? ""));
}

省略所有检查..

如果您愿意,可以测试第一个元素是xml,第二个元素是否为空。 我不确定这是不是一个好主意。