C#反序列化XML

时间:2011-06-12 13:47:37

标签: c# xmlserializer

使用XmlSerializer类将文档反序列化为对象时遇到问题。

编译我的反序列化函数:

   static public TYPE xmlToObject<TYPE>( string xmlDoc ) {
        MemoryStream stream = new MemoryStream();
        byte[] xmlObject = ASCIIEncoding.ASCII.GetBytes( xmlDoc );
        stream.Write( xmlObject, 0, xmlObject.Length );
        stream.Position = 0;

        TYPE message;

        XmlSerializer xmlSerializer = new XmlSerializer( typeof( TYPE ) );

        try {
            message = (TYPE)xmlSerializer.Deserialize( stream );
        } catch ( Exception e ) {
            message = default( TYPE );
        } finally {
            stream.Close();
        }
        return message;
    }

我上课了:

    public class Test {
           public int a;
           public int b;
    }

反序列化:

    string text = File.ReadAllText( "blue1.xml" );
    Test a = XmlInterpreter.xmlToObject<Test>( text );

好的,当我读到这样的文件时:

    <?xml version="1.0" encoding="UTF-8"?>
    <Test>
       <a>2</a>
       <b>5</b>
    </Test> 
一切都好。但是像这样:

    <?xml version="1.0" encoding="UTF-8"?>
    <Test>
        <a>2</a>
        <b></b>
    </Test> 

是错误的,因为

    <b></b> 

为空,转换为int是不可能的。

我该如何解决这个问题?例如,我希望在此上下文中不会声明b

我的班级是什么时候:

    public class Test {

        public enum Pro {
             VALUE1,
             VALUE2
        }

        public Pro p1;
   }

我希望接受xmlDocument,其中字段p1为空。

1 个答案:

答案 0 :(得分:4)

我希望第一个例子只是某种类型,因为它也有空b。首先,并非每个XML都可以反序列化为对象。特别是空元素是危险的,不应使用。如果要表示未定义b,请不要将其包含在XML文件中:

<?xml version="1.0" encoding="UTF-8"?>
<Test>
    <a>2</a>
</Test> 

或使你的b属性可以为空:

public class Test {
       public int a;
       public int? b;
}

并将XML定义为:

<?xml version="1.0" encoding="UTF-8"?>
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <a>2</a>
    <b xsi:nil="true" />
</Test> 

通常,如果要使用反序列化,请尝试首先使用序列化来了解有效XML的外观。