2011-06-12 201 views
0

我有反序列化文档的对象使用XmlSerializer类的问题。C#反序列化XML

代码我的功能反序列化:

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

现在好了,这是错误的 – nirmus 2011-06-12 14:01:05

回答

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的外观。

+0

+1为您的最后提示! – danyolgiax 2011-06-12 14:08:17

+0

感谢您的帮助和建议 – nirmus 2011-06-12 14:14:32