2010-02-10 10 views
8

È possibile mappare i nomi delle classi in arrivo utilizzando un SerializationBinder e sovrascrivendo il metodo BindToType, ma non ho trovato alcun modo di modificare il nome della classe nel processo di serializzazione. È possibile a tutti ??Modificare il nome della classe serializzata in .Net?

EDIT:

mi riferisco alla serializzazione utilizzando il System.Runtime.Serialization, e non il System.Xml.Serialization.

Grazie!

+0

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

+0

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. –

+0

Che tipo di serializzazione stai eseguendo? Binario? Xml? Altro? –

risposta

6

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); 
+0

funziona come previsto con List ? –

9

Non sono sicuro di seguirti, ma potresti utilizzare XmlTypeAttribute. È quindi possibile recuperare facilmente i suoi valori attraverso la riflessione.

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

Check this out:

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

+0

Ma questa è XmlSerialization, sto parlando della serializzazione che utilizza l'interfaccia SerializableAttribute e ISerializable. –

+0

La risposta dell'Islam Ibrahim è "la" risposta (per quanto ne so). – Pedro

2

si può fare con gli attributi:

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

Guardate utilizzando un surrogato + selettore surrogata. Che insieme a un legante sulla deserializzazione dovrebbe fare il trucco.

+0

Questo è molto interessante, ma non è quello che stavo cercando. Ho scoperto che posso usare l'oggetto 'SerializationInfo' di' GetObjectData' e modificare le proprietà 'AssemblyName' e' FullTypeName'. –

+1

Ciò è piuttosto pericoloso nel modo in cui potrebbe essere necessario serializzare le istanze in contesti indifferenti. ovvero trasferimento di dati tra livelli, clonazione, peristance, ecc. Se segui questo percorso, assicurati di specificare il contesto di streaming. (esempio) formatter.Context = new System.Runtime.Serialization.StreamingContext (System.Runtime.Serialization.StreamingContextStates.CrossMachine); e sii consapevole del fatto che sarai legato al raccoglitore per il quale hai nominato gli articoli. – MaLio

Problemi correlati