2010-03-02 6 views

risposta

38

Quando si utilizza il SerializableAttribute attributo si sta mettendo un attributo su un campo al momento della compilazione in modo tale che quando a run- tempo, le strutture di serializzazione sapranno cosa serializzare in base agli attributi eseguendo la riflessione sul tipo classe/modulo/assieme.

[Serializable] 
public class MyFoo { … } 

È possibile che questo indica che l'impianto di serializzazione devono serializzare l'intera classe MyFoo, mentre:

public class MyFoo 
{ 
    private int bar; 

    [Serializable] 
    public int WhatBar 
    { 
     get { return this.bar; } 
    } 
} 

Utilizzando l'attributo è possibile scegliere in modo selettivo quali campi deve essere serializzato.

Quando si implementa il ISerializable interface, la serializzazione in modo efficace ottiene sovrascritti con una versione personalizzata, sovrascrivendo GetObjectData e SetObjectData (e fornendo un costruttore della forma MyFoo(SerializationInfo info, StreamingContext context)), ci sarebbe stato un grado più fine di controllo sulla serializzazione dei dati.

Vedere anche this example of a custom serialization here on StackOverflow. Mostra come mantenere la serializzazione retroattiva - compatibile con versioni diverse dei dati serializzati.

Spero che questo aiuti.

+11

In quale versione di .NET è possibile aggiungere l'attributo 'Serializable' a una proprietà? MSDN dice che può essere applicato solo a classi, strutture, enumerazioni e delegati. – hangy

+5

Nessuno. L'attributo serializzabile non può essere applicato alle proprietà, solo le dichiarazioni di classe, struct ed enum e delegate. –

+3

È il contrario: quando la classe è decorata con 'SerializableAttribute', un membro può essere contrassegnato con' NonSerializedAttribute' da saltare, come detto da più persone (e MSDN), quando la ricostruzione di un determinato oggetto non ha senso in un ambiente diverso, è saggio non serializzarlo ... – nurchi

19

Il SerializableAttribute indica al framework di eseguire il processo di serializzazione predefinito. Se è necessario un maggiore controllo, è possibile implementare lo ISerializable interface. Quindi inserire il proprio codice per serializzare l'oggetto nel metodo GetObjectData e aggiornare l'oggetto SerializationInfo passato a esso.

+3

Se si implementa ISerializable, è anche consuetudine (o forse anche necessaria) per implementare il costruttore deserializzazione: protetta (informazioni SerializationInfo, context StreamingContext) SomeClass – jrista

+16

Si noti che è ancora necessario contrassegnare la classe [Serializable] anche se si implementa l'interfaccia ISerializable. –

1

ISerialize forza a implementare logicamente la logica di serializzazione, mentre contrassegnando per attributo serializzabile (lo intendevi?) Dirà al serializzatore binario che questa classe può essere serializzata. Lo farà automaticamente.

+0

sì, questo è quello che intendevo. – SoftwareGeek

0

Ereditare da ISerializable consente di implementare la (de) serializzazione personalizzata. Quando si utilizza solo l'attributo Serializable, la (de) serializzazione può essere controllata solo dagli attributi ed è meno flessibile.

+0

La deserializzazione viene gestita tramite il costruttore di deserializzazione. Vedi il mio commento sulla risposta segfaults. – jrista

3

L'interfaccia ISerializable consente di implementare la serializzazione personalizzata diversa da quella predefinita. Quando si implementa l'interfaccia ISerializable, è necessario sostituire GetObjectData metodo come segue

public void GetObjectData (SerializationInfo serInfo, 
            StreamingContext streamContext) 
{ 
    // Implement custom Serialization 
} 
Problemi correlati