Qual è la differenza tra l'utilizzo dell'attributo Serializable
e l'implementazione dell'interfaccia ISerializable
?Qual è la differenza tra l'uso dell'attributo Serializable e l'implementazione ISerializable?
risposta
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
(e fornendo un costruttore della forma SetObjectData
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.
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
Nessuno. L'attributo serializzabile non può essere applicato alle proprietà, solo le dichiarazioni di classe, struct ed enum e delegate. –
È 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
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.
Se si implementa ISerializable, è anche consuetudine (o forse anche necessaria) per implementare il costruttore deserializzazione: protetta (informazioni SerializationInfo, context StreamingContext) SomeClass – jrista
Si noti che è ancora necessario contrassegnare la classe [Serializable] anche se si implementa l'interfaccia ISerializable. –
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.
sì, questo è quello che intendevo. – SoftwareGeek
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.
La deserializzazione viene gestita tramite il costruttore di deserializzazione. Vedi il mio commento sulla risposta segfaults. – jrista
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
}
- 1. c'è una differenza tra [Serializable] e [Serializable()] in C#?
- 2. Qual è la differenza tra = e: =
- 3. Qual è la differenza tra Verilog! e ~?
- 4. Qual è la differenza tra? : e ||
- 5. qual è la differenza tra [[], []] e [[]] * 2
- 6. Qual è la differenza tra $ e $$?
- 7. Qual è la differenza tra ("") e (null)
- 8. Qual è la differenza tra dict() e {}?
- 9. Qual è la differenza tra " " e ""?
- 10. Qual è la differenza tra {0} e ""?
- 11. Qual è la differenza tra `##` e `hashCode`?
- 12. Qual è la differenza tra {0} e +?
- 13. Qual è la differenza tra .ToString() e + ""
- 14. qual è la differenza tra:.! e: r !?
- 15. Qual è la differenza tra "è Nessuno" e "== Nessuno"
- 16. differenza tra l'attributo DataContract e l'attributo Serializable in .net
- 17. Unix: Qual è la differenza tra la fonte e l'esportazione?
- 18. Qual è la differenza tra il callback e la promessa
- 19. Qual è la differenza tra la sezione .got e .got.plt?
- 20. Qual è la differenza tra la lista() e []
- 21. Qual è la differenza tra GHC e la piattaforma Haskell?
- 22. Qual è la differenza tra sé e la finestra?
- 23. Qual è la differenza tra la cartella vim72 e vimfiles?
- 24. Qual è la differenza tra la serratura e RLock
- 25. Qual è la differenza tra la funzione() {}() e function() {}()
- 26. Qual è la differenza tra la crittografia SHA e AES?
- 27. Qual è la differenza tra la [OptionalField] e [NonSerialized]
- 28. Qual è la differenza tra Chisel e Lava e CLaSH?
- 29. Qual è la differenza tra queste funzioni
- 30. Qual è la differenza tra queste funzioni?
correlati: http://stackoverflow.com/q/5877808/945456 –