使用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
为空。
答案 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的外观。