2012-03-22 58 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

相关问题