2010-02-10 23 views
8

Tôi có thể ánh xạ các tên lớp đến bằng cách sử dụng SerializationBinder và ghi đè phương pháp BindToType, nhưng tôi không tìm thấy cách thay đổi tên của lớp trong quá trình tuần tự hóa. Có thể ở tất cả??Thay đổi tên của lớp đang được đăng trong .Net?

EDIT:

tôi đề cập đến serialization bằng cách sử dụng System.Runtime.Serialization, và không phải là System.Xml.Serialization.

Cảm ơn!

+0

bạn có thể miêu tả với tôi lý do tại sao bạn muốn làm điều đó? Tôi thường thấy rằng nếu không có một chức năng/phương pháp cho những gì tôi đang cố gắng để làm sau đó tôi đang thiếu một giải pháp đơn giản hơn nhiều hoặc tôi chỉ đang cố gắng làm một cái gì đó kỳ lạ. – Lazarus

+0

Tôi muốn làm điều đó để làm cho quá trình serialization và deserialization độc lập với tên lớp, để nếu tôi đổi tên lớp, hoặc thay đổi không gian tên của lớp, serialization và deserialization sẽ không thay đổi gì cả. –

+0

Bạn đang thực hiện loại Serialization nào? Nhị phân? Xml? Khác? –

Trả lời

6

tôi phát hiện ra rằng tôi có thể sử dụng đối tượng SerializationInfo mà đến trong GetObjectData chức năng, và thay đổi AssemblyNameFullTypeName tài sản, để khi tôi deserialize tôi có thể sử dụng một SerializationBinder để lập bản đồ lắp ráp tùy chỉnh và gõ tên trở lại một loại hợp lệ. Đây là một Semple:

Serializable lớp:

[Serializable] 
class MyCustomClass : ISerializable 
{ 
    string _field; 
    void MyCustomClass(SerializationInfo info, StreamingContext context) 
    { 
     this._field = info.GetString("PropertyName"); 
    } 
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AssemblyName = "MyCustomAssemblyIdentifier"; 
     info.FullTypeName = "MyCustomTypeIdentifier"; 
     info.AddValue("PropertyName", this._field); 
    } 
} 

SerializationBinder:

public class MyBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     if (assemblyName == "MyCustomAssemblyIdentifier") 
      if (typeName == "MyCustomTypeIdentifier") 
       return typeof(); 
     return null; 
    } 
} 

đang serialization:

var fs = GetStream(); 
BinaryFormatter f = new BinaryFormatter(); 
f.Binder = new MyBinder(); 
var obj = (MyCustomClass)f.Deserialize(fs); 
mã 0

Deserialization:

var fs = GetStream(); 
MyCustomClass obj = GetObjectToSerialize(); 
BinaryFormatter f = new BinaryFormatter(); 
f.Deserialize(fs, obj); 
+0

hoạt động như mong đợi với Danh sách ? –

9

Tôi không chắc chắn nếu tôi theo dõi bạn, nhưng bạn có thể sử dụng XmlTypeAttribute. Sau đó bạn có thể dễ dàng lấy lại các giá trị của nó thông qua sự phản chiếu.

[XmlType(Namespace = "myNamespaceThatWontChange", 
TypeName = "myClassThatWontChange")] 
public class Person 
{ 
    public string Name; 
} 

Kiểm tra này ra:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute%28VS.100%29.aspx

+0

Nhưng đây là XmlSerialization, tôi đang nói về serialization sử dụng giao diện SerializableAttribute và ISerializable. –

+0

Câu trả lời của Islam Ibrahim là 'câu trả lời' sau đó (theo như tôi biết). – Pedro

2

Bạn có thể làm điều đó với các thuộc tính:

[System.Xml.Serialization.XmlRoot("xmlName")] 
public Class ClassName 
{ 
} 
0

Nhìn vào cách sử dụng một đại diện + chọn thay thế. Điều đó cùng với một chất kết dính trên deserialization nên làm các trick.

+0

Điều này rất thú vị, nhưng nó không phải là những gì tôi đang tìm kiếm. Tôi phát hiện ra rằng tôi có thể sử dụng đối tượng 'SerializationInfo' của' GetObjectData' và thay đổi cả thuộc tính 'AssemblyName' và' FullTypeName'. –

+1

Điều này khá nguy hiểm theo cách bạn có thể cần phải tuần tự hóa các trường hợp bối cảnh không quan tâm. ví dụ: chuyển dữ liệu giữa các cấp, nhân bản, khả năng tồn tại, v.v. Nếu bạn thực hiện tuyến đường này, hãy đảm bảo chỉ định ngữ cảnh phát trực tuyến. (ví dụ) formatter.Context = new System.Runtime.Serialization.StreamingContext (System.Runtime.Serialization.StreamingContextStates.CrossMachine); và cũng lưu ý rằng bạn sẽ bị ràng buộc với chất kết dính mà bạn đặt tên cho các mục. – MaLio

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