O que é [Serializable] e quando devo usá-lo?

Respostas:

368

O que é isso?

Quando você cria um objeto em um aplicativo de estrutura .Net, não precisa pensar em como os dados são armazenados na memória. Porque o .Net Framework cuida disso para você. No entanto, se você deseja armazenar o conteúdo de um objeto em um arquivo, enviar um objeto para outro processo ou transmiti-lo pela rede, é necessário pensar em como o objeto é representado, pois será necessário converter para um formato diferente. . Essa conversão é chamada de serialização.

Usos para serialização

A serialização permite que o desenvolvedor salve o estado de um objeto e o recrie conforme necessário, fornecendo armazenamento de objetos e troca de dados. Por meio da serialização, um desenvolvedor pode executar ações como enviar o objeto para um aplicativo remoto por meio de um serviço da Web, passar um objeto de um domínio para outro, passar um objeto através de um firewall como uma string XML ou manter a segurança ou a segurança específica do usuário. informações entre aplicativos.

Aplique SerializableAttributea um tipo para indicar que instâncias desse tipo podem ser serializadas. Aplique o SerializableAttributemesmo se a classe também implementar a ISerializableinterface para controlar o processo de serialização.

Todos os campos públicos e privados de um tipo marcado por SerializableAttributesão serializados por padrão, a menos que o tipo implemente a ISerializableinterface para substituir o processo de serialização. O processo de serialização padrão exclui os campos marcados com NonSerializedAttribute. Se um campo de um tipo serializável contiver um ponteiro, um identificador ou alguma outra estrutura de dados específica de um ambiente específico e não puder ser significativamente reconstituída em um ambiente diferente, convém aplicar NonSerializedAttributea esse campo.

Veja MSDN para mais detalhes.

Editar 1

Qualquer motivo para não marcar algo como serializável

Ao transferir ou salvar dados, você precisa enviar ou salvar apenas os dados necessários. Portanto, haverá menos atrasos na transferência e problemas de armazenamento. Assim, você pode optar por excluir um bloco desnecessário de dados ao serializar.

CharithJ
fonte
1
@dwbartz Sua pergunta foi respondida aqui link
jayasurya_j
2
Agradável explination, seria bom para adicionar este para o atributo no MSDN =)
Martea
@jayasurya_j Pena que a resposta aceita não falar muito sobre as partes íntimas
Alexander
1
Boa Explicação
Zakir HC 30/01
42

Alguns usos práticos para o [Serializable]atributo:

  • Salvando o estado do objeto usando serialização binária; você pode facilmente 'salvar' instâncias inteiras de objetos em seu aplicativo em um arquivo ou fluxo de rede e depois recriá-las desserializando - confira a BinaryFormatterclasse em System.Runtime.Serialization.Formatters.Binary
  • As classes de escrita cujas instâncias de objeto podem ser armazenadas na área de transferência usando Clipboard.SetData()classes não-socializáveis ​​não podem ser colocadas na área de transferência.
  • Escrevendo aulas compatíveis com o .NET Remoting; geralmente, qualquer instância de classe que você passar entre domínios de aplicativo (exceto aqueles que se estendem de MarshalByRefObject) deve ser serializável.

Esses são os casos de uso mais comuns que já encontrei.

Bradley Smith
fonte
42

Como a pergunta original era sobre o SerializableAttribute, observe-se que esse atributo se aplica apenas ao usar o BinaryFormatter ou SoapFormatter.

É um pouco confuso, a menos que você preste atenção aos detalhes, a respeito de quando usá-lo e qual é o seu objetivo real.

Não tem nada a ver com serialização XML ou JSON.

Usadas com o SerializableAttribute são a ISerializable Interface e a SerializationInfo Class. Eles também são usados ​​apenas com o BinaryFormatter ou SoapFormatter.

A menos que você pretenda serializar sua classe usando Binário ou Sabão, não se preocupe em marcar sua classe como [Serializable]. Os serializadores XML e JSON nem sabem da sua existência.

BLaminack
fonte
16
"Não tem nada a ver com serialização XML ou JSON" - OBRIGADO! Finalmente uma explicação por isso que eu posso feliz serializar qualquer classe para XML com ou sem este atributo
userSteve
1
Você tem uma fonte para isso?
Michiel van Oosterhout
"Os serializadores XML e JSON nem sabem da sua existência". Eu não sei disso. Quando eu JSON formatou uma classe via WCF, os nomes das propriedades saíram com um sublinhado anterior, se a classe era Serializablee sem quando o atributo foi removido. Então, alguma interferência é possível.
Jens
@ Jens, se eu entendi corretamente JSON.net não me importo nem um pouco com isso, mas o asp.net altera esse comportamento um pouco. Eu acredito que você pode contornar isso com os atributos JsonObject / JsonProperty.
Base
29

Serialização é o processo de converter um objeto em um fluxo de bytes para armazenar o objeto ou transmiti-lo à memória, banco de dados ou arquivo.

Como funciona a serialização

Esta ilustração mostra o processo geral de serialização.

insira a descrição da imagem aqui

O objeto é serializado em um fluxo, que carrega não apenas os dados, mas informações sobre o tipo do objeto, como sua versão, cultura e nome do assembly. A partir desse fluxo, ele pode ser armazenado em um banco de dados, um arquivo ou memória.

Detalhes em msdn.

Mahbubur Rahman
fonte
14

Serialização

Serialização é o processo de converter um objeto ou um conjunto de objetos em um fluxo, é uma matriz de bytes no caso de serialização binária

Usos de serialização

  1. Para salvar o estado de um objeto em um arquivo, banco de dados etc. e usá-lo posteriormente.
  2. Para enviar um objeto de um processo para outro (Domínio do Aplicativo) na mesma máquina e também enviá-lo por cabo para um processo em execução em outra máquina.
  3. Para criar um clone do objeto original como um backup enquanto trabalha no objeto principal.
  4. Um conjunto de objetos pode ser facilmente copiado para a área de transferência do sistema e colado no mesmo ou em outro aplicativo

Abaixo estão alguns atributos personalizados úteis que são usados ​​durante a serialização de um objeto

[Serializable] -> É usado quando marcamos o serializável de um objeto [NonSerialized] -> É usado quando não queremos serializar o campo de um objeto. [OnSerializing] -> É usado quando queremos executar alguma ação ao serializar um objeto [OnSerialized] -> É usado quando queremos executar alguma ação após serializar um objeto no fluxo.

Abaixo está o exemplo de serialização

[Serializable]
    internal class DemoForSerializable
    {
        internal string Fname = string.Empty;
        internal string Lname = string.Empty;

        internal Stream SerializeToMS(DemoForSerializable demo)
        {
            DemoForSerializable objSer = new DemoForSerializable();
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, objSer);
            return ms;
        }

        [OnSerializing]
        private void OnSerializing(StreamingContext context) {
            Fname = "sheo";
            Lname = "Dayal";
        }
        [OnSerialized]
        private void OnSerialized(StreamingContext context)
        {
       // Do some work after serialized object
        }

    }

Aqui está o código de chamada

class Program
    {
        string fname = string.Empty;
        string Lname = string.Empty; 

       static void Main(string[] args)
        {
            DemoForSerializable demo = new DemoForSerializable();

            Stream ms = demo.SerializeToMS(demo);
            ms.Position = 0;

            DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable;

            Console.WriteLine(demo1.Fname);
            Console.WriteLine(demo1.Lname);
            Console.ReadLine();
        }

    }
Sheo Dayal Singh
fonte