2014-01-09 100 views
2

我想轉換一個對象說用戶有多個字段到XML。問題是我在嘗試序列化ILIST成員時遇到異常。 以下是我使用的代碼:如何將包含ILIST成員的對象序列化爲XML?

var stringwriter = new System.IO.StringWriter(); 
var serializer = new XmlSerializer(User.GetType()); <!-- Getting exception here --> 
serializer.Serialize(stringwriter, User); 
return stringwriter.ToString(); 

我的用戶看起來是這樣的:

class User 
{  public virtual string Name{ get; set; } 
     public virtual DateTime? LastUpdated { get; set; } 

     public virtual int? ContactId { get; set; } 

     public virtual IList<Sector> Sectors { get; set; } 
     public virtual AccessLevel AccessLevel { get; set; } 
     public virtual IList<UserRole> UserRole { get; set; } 
} 

是否存在被我可以檢查其對象的類中的一員,我序列化方式是否可序列化,然後調整該特定成員的邏輯。我對用戶類的控制較少。 :(因此,任何方式在那裏我可以延長我的代碼來處理IList的成員將被優先

+0

嘗試標記'User'類爲'serializable',對於添加[SerializableAttribute](http://msdn.microsoft.com/ en-us/library/system.serializableattribute(v = vs.110).aspx) – Grundy

+1

什麼是異常消息? – Alberto

+0

'用戶'在你的代碼它和類和對象或只有類? – Grundy

回答

4

舊式的XML序列化不能處理接口 - 它想要的具體類型

但是,你可以做到這一點。較新的DataContractSerializer

下面是基於您的代碼示例:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Text; 
using System.Xml; 

namespace Demo 
{ 
    [DataContract(Namespace = "")] 
    public class User 
    { 
     [DataMember] 
     public virtual string Name 
     { 
      get; 
      set; 
     } 

     [DataMember] 
     public virtual DateTime? LastUpdated 
     { 
      get; 
      set; 
     } 

     [DataMember] 
     public virtual int? ContactId 
     { 
      get; 
      set; 
     } 

     [DataMember] 
     public virtual IList<string> Sectors 
     { 
      get; 
      set; 
     } 
    } 

    internal class Program 
    { 
     private void run() 
     { 
      User user = new User(); 

      user.Sectors = new[] {"One", "Two", "Three"}; 
      user.Name = "Test Name"; 

      // Serialize 

      var result = new StringBuilder(); 
      DataContractSerializer serializer = new DataContractSerializer(user.GetType()); 

      using (var stringWriter = new StringWriter(result)) 
      using (var xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings { Indent = true })) 
      { 
       serializer.WriteObject(xmlWriter, user); 
      } 

      string serialisedToString = result.ToString(); 

      Console.WriteLine(serialisedToString); 

      // Deserialize 

      using (var stringReader = new StringReader(serialisedToString)) 
      using (var xmlReader = XmlReader.Create(stringReader)) 
      { 
       user = (User) serializer.ReadObject(xmlReader); 
      } 

      Console.WriteLine(user.Name); 
     } 

     private static void Main() 
     { 
      new Program().run(); 
     } 
    } 
} 
+0

有沒有一種方法,我可以檢查,如果我的序列化對象的類的成員是可序列化或者不是,然後調整該特定成員的邏輯。我對用戶類的控制較少。 :(因此,我可以擴展我的代碼來處理IList成員的任何方式將是首選。 –

+0

@RossCooper有沒有簡單的方法,我知道... –