2010-07-01 49 views
9

我目前使用我的DataSets的包装类,以实现自定义序列化。我想使用DataContractSerializer(更喜欢使用它),但仍支持自定义序列化。问题是[DataContract][Serializable]属性似乎并没有这么好......我怎么能覆盖序列化,并支持ISerializable序列化? 包装DataSet类的代码在这里:使用DataContractSerializer自定义序列化

[Serializable()]  
[System.Runtime.InteropServices.ComVisible(false)] 
public class TestDatasetWrapper : TestDataSet, ISerializable 
{ 
    public TestDatasetWrapper() 
     : base() 
    {} 

    protected TestDatasetWrapper(SerializationInfo info, StreamingContext context) 
    { 
     SerializationHelper.DeserializeTypedDataSet(info, this); 
    } 

    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     SerializationHelper.AddTypedDataSetObjectData(info, this); 
    } 
} 

谢谢!

回答

12

DataContractAttribute和SerializableAttribute可以一起使用。这里的奖励是,你也不需要使用单独的串行器。 DataContractSerialzer是一个XmlObjectSerializer,它本身支持[Serializable]。例如:

[Serializable] 
public class TestClass 
{ 
    public string Name { get; set; } 
} 

{ 
    var formatter = new DataContractSerializer(typeof(TestClass)); 
    using (var stream = new MemoryStream()) 
    { 
     var instance = new TestClass { Name = "Matt" }; 
     formatter.WriteObject(stream, instance); 

     stream.Seek(0, SeekOrigin.Begin); 

     var second = (TestClass) formatter.ReadObject(stream); 
     Console.WriteLine(second.Name); 
    } 
} 

输出: “马特”

使用只是一个SerializableAttribute属性,我们可以成功地连载和deserialise使用DataContractSerializer的对象...

使用ISerializable的,我们可以做同样的事情:

[Serializable] 
public class TestClass2 : ISerializable 
{ 
    public TestClass2() { } 
    protected TestClass2(SerializationInfo info, StreamingContext context) 
    { 
     Name = info.GetString("name").ToUpper(); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("name", Name); 
    } 

    public string Name { get; set; } 
} 

{ 
    var formatter = new DataContractSerializer(typeof(TestClass2)); 
    using (var stream = new MemoryStream()) 
    { 
     var instance = new TestClass2 { Name = "Matt" }; 
     formatter.WriteObject(stream, instance); 

     stream.Seek(0, SeekOrigin.Begin); 

     var second = (TestClass2)formatter.ReadObject(stream); 
     Console.WriteLine(second.Name); 
    } 
} 

OUTPUT “MATT”

并配有DataContractAttribute:

[DataContract, Serializable] 
public class TestClass3 
{ 
    public int Age { get; set; } 

    [DataMember] 
    public string Name { get; set; } 
} 

{ 
    var formatter = new DataContractSerializer(typeof(TestClass3)); 
    using (var stream = new MemoryStream()) 
    { 
     var instance = new TestClass3 { Name = "Matt", Age = 26 }; 
     formatter.WriteObject(stream, instance); 

     stream.Seek(0, SeekOrigin.Begin); 

     var second = (TestClass3)formatter.ReadObject(stream); 
     Console.WriteLine(second.Name); 
     Console.WriteLine(second.Age); 
    } 
} 

OUTPUT: “马特”

OUTPUT:0

当的DataContractSerializer遇到类型与DataContractAttribute ,它将使用它来代替将序列化传递给其基类型,该类型处理SerializableAttribute和ISerializable int erfaces。

如果遇到问题,是序列化还是反序列化,还是两者兼有?

+1

Downvoted是因为? – 2013-09-30 10:22:43

+0

您的所有样品中的3个似乎都缺少功能特征线。 – dotNET 2017-05-24 18:04:50

相关问题