2012-03-22 59 views
0

列出的名單上有一些具有List<object>類型的屬性類,我需要使用DataContractSerializer的那類序列化到XML文件中。序列化失敗使用的DataContractSerializer

序列化上ArgumentException失敗時,所述對象是List<T>/IEnumerator<T>異常消息:

名稱無效字符在 「System.Collections.Generic.List`1 [[MyProj.Result,的Myproj, 版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'。

這裏是失敗 ,是以List<object>

[DataContract(IsReference = true)] 
    public class RecoveryMethodData 
    { 
     [DataMember] 
     public List<object> Parameters { get; set; } 


     public RecoveryMethodData() 
     { 
      Parameters = new List<object>(); 
     } 

     public static void SerializeToFile(RecoveryMethodData recoveryMethodData, string fileName) 
     { 
      var encoding = Encoding.UTF8; 
      using (var fileWriter = new XmlTextWriter(fileName, encoding)) 
      { 

       fileWriter.Formatting = Formatting.Indented; 
       // use SharedTypeResolver for deserializing assistance. 
       var serializer = new DataContractSerializer(typeof(RecoveryMethodData), null, int.MaxValue, false, true, null, new SharedTypeResolver()); 
       serializer.WriteObject(fileWriter, recoveryMethodData); 
      } 
     } 
} 

下面的類是使用的代碼示例:

private void TestSerialization() 
{ 
    var methodData = new RecoveryMethodData(); 
    var result = new Result() {Message = "wow", Pass = true, FileName = "somefile "}; 
    methodData.Parameters.Add(result); 
    methodData.Parameters.Add(true); 
    var list1 = new List<Result>(); 
    list1.Add(new Result(){FileName = "in list1", Message = "in l 1"}); 
    list1.Add(new Result(){FileName = "in list2", Message = "in l 2"}); 
    methodData.Parameters.Add(list1); 
    RecoveryMethodData.SerializeToFile(methodData,@"C:\serialization_result.xml"); 
} 
public class Result 
{ 
    public string Message { get; set; } 
    public string FileName { get; set; } 
} 

如果我不添加列表1到methodData.Parameters有序列化methodDatad對象沒有問題。

的一個大限制是,我不知道哪種對象將被添加到Parameters屬性前進(這就是爲什麼它是對象的列表)

回答

0

爲了DataContractSerializer的序列化對象它應該知道所有數據成員的類型。在你的情況下,你沒有定義一個特定的類型,而是一個對象類型。嘗試改變的

public List<object> Parameters { get; set; } 

的定義是這樣的:

public List<IMyObject> Parameters { get; set; } 

需要注意的是,你所有的物體,你正試圖添加到參數表將繼承IMyObject接口。

更新:我重構你的代碼了一些點(仍然在一個糟糕的形狀),似乎工作,請試試;

public class Tester 
{ 
    public Tester() 
    { 
     this.TestSerialization(); 

    } 

    public void SerializeToFile(RecoveryMethodData recoveryMetaData,string fileName) 
    { 
     var encoding = Encoding.UTF8; 
     using (var fileWriter = new XmlTextWriter(fileName, encoding)) 
     { 

      fileWriter.Formatting = Formatting.Indented; 
      // use SharedTypeResolver for deserializing assistance. 
      var serializer = new DataContractSerializer(typeof(RecoveryMethodData),new List<Type>(){typeof(bool),typeof(Result),typeof(List<Result>)});     
      serializer.WriteObject(fileWriter,recoveryMetaData); 
     } 
    } 

    private void TestSerialization() 
    { 
     var methodData = new RecoveryMethodData(); 
     var result = new Result() { Message = "wow", Pass = true, FileName = "somefile " }; 
     methodData.Add(result); 
     methodData.Add(true); 
     var list1 = new List<Result>(); 
     list1.Add(new Result() { FileName = "in list1", Message = "in l 1" }); 
     list1.Add(new Result() { FileName = "in list2", Message = "in l 2" }); 
     methodData.Add(list1); 
     SerializeToFile(methodData, @"C:\serialization_result.xml"); 
    } 
} 

public class Result 
{ 
    public string Message { get; set; } 
    public string FileName { get; set; } 
    public bool Pass { get; set; } 
} 


public class RecoveryMethodData : List<object> 
{ 

} 
+0

這有幾個問題 - 我給參數添加一個List 。所以我創建了一個新類MyList :List ,IMyObject。這也會出現同樣的錯誤。 – user1052768 2012-03-22 10:43:31

+0

你是對的,列表的問題將持續存在。但主要的問題是,你正試圖序列化未知類型。 c#中的每個類都從對象繼承;但序列化程序應該很熟悉該類以創建相關的xml數據。 – daryal 2012-03-22 12:00:04

相關問題