2012-07-12 160 views
52

我有一个名为WebserviceType的类,我从XSD文件的工具xsd.exe中获得了该类。将对象转换为XML字符串

现在我想将一个WebServiceType对象的实例反序列化为一个字符串。 我该怎么做?

MethodCheckType对象具有作为参数的WebServiceType数组。

我第一次尝试像我连载它:用XmlSerializerStringWriter(序列化时我用了StringReader)。

这是我序列化WebServiceType对象的方法:

XmlSerializer serializer = new XmlSerializer(typeof(MethodCheckType)); 
     MethodCheckType output = null; 
     StringReader reader = null; 

     // catch global exception, logg it and throw it 
     try 
     { 
      reader = new StringReader(path); 
      output = (MethodCheckType)serializer.Deserialize(reader); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
     finally 
     { 
      reader.Dispose(); 
     } 

     return output.WebService; 

编辑:

也许我可以说,它在不同的字:我有这个MethodCheckType对象的实例另一方面,我得到了我从中序列化这个对象的XML文档。现在我想将这个实例转换成一个字符串形式的XML文档。在此之后,我必须证明两个字符串(XML文档)是否相同。我必须这么做,因为我对第一种方法进行了单元测试,在这种方法中,我将一个XML文档读入StringReader并将其序列化为MethodCheckType对象。

+2

你会得到什么错误?你可能会混淆这些术语:序列化(在XML世界中)是将*从一个对象转换成XML *;反序列化将*从XML转换为对象*。你是否想从**一个XML字符串反序列化一个对象**? – carlosfigueira 2012-07-12 08:13:40

回答

116

这里是两种方式的转换方法。 此=类

public string ToXML() 
    { 
     var stringwriter = new System.IO.StringWriter(); 
     var serializer = new XmlSerializer(this.GetType()); 
     serializer.Serialize(stringwriter, this); 
     return stringwriter.ToString(); 
    } 

public static YourClass LoadFromXMLString(string xmlText) 
    { 
     var stringReader = new System.IO.StringReader(xmlText); 
     var serializer = new XmlSerializer(typeof(YourClass)); 
     return serializer.Deserialize(stringReader) as YourClass ; 
    } 
+3

您可以使用'泛型'使您的代码更通用:) – 2012-07-12 09:07:14

+8

您应该使用'使用'模式或调用'Dispose'方法来释放正确的资源。 – 2013-11-23 12:01:58

+2

为什么?没有使用非托管参考... – 2013-11-23 21:59:28

49

的情况下我意识到这是一个非常古老的职位,但看着LB的回应后,我想到了,我怎么能提高所接受的答案,并使它通用为我自己的应用程序。以下是我想出了:

public static string Serialize<T>(T dataToSerialize) 
{ 
    try 
    { 
     var stringwriter = new System.IO.StringWriter(); 
     var serializer = new XmlSerializer(typeof(T)); 
     serializer.Serialize(stringwriter, dataToSerialize); 
     return stringwriter.ToString(); 
    } 
    catch 
    { 
     throw; 
    } 
} 

public static T Deserialize<T>(string xmlText) 
{ 
    try 
    { 
     var stringReader = new System.IO.StringReader(xmlText); 
     var serializer = new XmlSerializer(typeof(T)); 
     return (T)serializer.Deserialize(stringReader); 
    } 
    catch 
    { 
     throw; 
    } 
} 

这些方法现在可以放置在静态辅助类,这意味着没有重复代码到每个需要被序列化类。

+5

在“Serialize”方法上,使用dataToSerialize.GetType()而不是typeof(T)。乍一看,这似乎是安全的使用T作为类型,但如果“dataToSerialize”对象已转换为父类型(ChildClass转换为BaseClass)它将引发错误。当然,首先检查它为空。 – 2015-10-22 03:13:58

+0

它像一个魅力:-)。好&容易soln。 – Karan 2016-06-23 14:56:26

+0

捕捉的重点是什么? – crush 2018-02-20 22:10:18

14
public static string Serialize(object dataToSerialize) 
    { 
     if(dataToSerialize==null) return null; 

     using (StringWriter stringwriter = new System.IO.StringWriter()) 
     { 
      var serializer = new XmlSerializer(dataToSerialize.GetType()); 
      serializer.Serialize(stringwriter, dataToSerialize); 
      return stringwriter.ToString(); 
     } 
    } 

    public static T Deserialize<T>(string xmlText) 
    { 
     if(String.IsNullOrWhiteSpace(xmlText)) return default(T); 

     using (StringReader stringReader = new System.IO.StringReader(xmlText)) 
     { 
      var serializer = new XmlSerializer(typeof(T)); 
      return (T)serializer.Deserialize(stringReader); 
     } 
    } 
+1

序列化确实需要泛型。对象就够了。 if(dataToSerialize == null)返回null; ... var serializer = new XmlSerializer(dataToSerialize.GetType()); ... – AlphaOmega 2014-04-23 15:21:58

+0

也许更改使用'object'的源代码? – Kiquenet 2015-11-26 15:30:59