ho scoperto che posso utilizzare l'oggetto SerializationInfo
che arriva nella funzione GetObjectData
, e modificare le proprietà AssemblyName
e FullTypeName
, in modo che quando ho deserializzare posso usare un SerializationBinder
per mappare l'assembly personalizzato e nome-tipo di nuovo a un tipo valido Ecco un Semple:
classe Serializable:
[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;
}
}
codice di serializzazione:
var fs = GetStream();
BinaryFormatter f = new BinaryFormatter();
f.Binder = new MyBinder();
var obj = (MyCustomClass)f.Deserialize(fs);
Codice 0
deserializzazione:
var fs = GetStream();
MyCustomClass obj = GetObjectToSerialize();
BinaryFormatter f = new BinaryFormatter();
f.Deserialize(fs, obj);
fonte
2010-02-10 16:35:44
Può descrivere a me perché ci si vuole farlo? Trovo spesso che se non c'è una funzione/metodo per quello che sto cercando di fare, mi manca una soluzione molto più semplice o sto solo cercando di fare qualcosa di strano. – Lazarus
Voglio farlo per rendere il processo di serializzazione e deserializzazione indipendente dal nome della classe, in modo che se si rinomina la classe o si modifichi lo spazio dei nomi della classe, la serializzazione e la deserializzazione non cambieranno affatto. –
Che tipo di serializzazione stai eseguendo? Binario? Xml? Altro? –