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 AssemblyName
và FullTypeName
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);
Nguồn
2010-02-10 16:35:44
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
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ả. –
Bạn đang thực hiện loại Serialization nào? Nhị phân? Xml? Khác? –