2010-07-01 23 views
9

Tôi hiện đang sử dụng các lớp trình bao bọc cho DataSets của mình, để triển khai thực hiện tuần tự hóa tùy chỉnh. Tôi muốn sử dụng DataContractSerializer (giống như phải sử dụng nó) nhưng vẫn hỗ trợ serialization tùy chỉnh. Vấn đề là các thuộc tính [DataContract][Serializable] dường như không hòa hợp tốt ... làm thế nào tôi có thể ghi đè lên việc tuần tự hóa và hỗ trợ BOTH DataContract & serialization ISerializable? Mã cho lớp Trình bao dữ liệu được đưa vào đây:Nối tiếp tùy chỉnh với 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); 
    } 
} 

Cảm ơn!

Trả lời

12

DataContractAttribute và SerializableAttribute cả hai có thể được sử dụng cùng nhau. Tiền thưởng ở đây là, bạn không cần phải sử dụng serialisers riêng biệt hoặc. DataContractSerialzer là một XmlObjectSerializer, mà chính nó hỗ trợ [Serializable]. Ví dụ:

[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); 
    } 
} 

OUTPUT: "Matt"

Sử dụng một chỉ là một SerializableAttribute thuộc tính chúng ta có thể thành công serialise và deserialise một đối tượng bằng cách sử dụng DataContractSerializer ...

Sử dụng ISerializable, chúng ta có thể làm điều tương tự:

[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"

Và với một 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: "Matt"

OUTPUT: 0

Khi DataContractSerializer gặp một kiểu với một DataContractAttribute , nó sẽ sử dụng nó thay vì truyền serialization đến kiểu cơ sở của nó, xử lý SerializableAttribute và ISerializable int erfaces.

Nếu bạn đang gặp sự cố, có phải là sắp xếp theo tuần tự, hoặc với deserialisation hoặc cả hai?

+1

Được giảm giá vì? –

+0

Tất cả 3 mẫu của bạn có vẻ thiếu dòng chữ ký chức năng. – dotNET

Các vấn đề liên quan