Pergunta

Me deparei com esta pergunta no transcender:

O que você deve aplicar a um campo se seu valor não for obrigatório durante a desserialização?

Eu = [Não Serializado], RESPOSTA = [Campo Opcional]

Minha reação instintiva foi NonSerialised, mas Transcender diz que estou errado.Tenho uma boa ideia do que procurar no que diz respeito ao atributo [Nonseralized], mas ainda assim gostaria que isso fosse esclarecido.

Pelo que posso dizer, o primeiro tem uma relação com conflitos de versão entre versões mais recentes e mais antigas do mesmo assembly.Este último está mais preocupado em não serializar um campo FULLSTOP.Existe mais alguma coisa que possa diferenciar esses dois?O MSDN realmente não diz muito sobre isso, pois ambos são usados ​​​​no BinaryFormatters e no SoapFormatter com o XMLFormatter usando o XMLIgnoreAttribute.

Minha segunda pergunta é: você pode misturar e combinar qualquer um dos dois atributos?Ainda não os usei.

Apenas lançando este aí, mas minha resposta tem algo a ver com a maneira como [OnDeserialized] e a interface IdeserilizationCallback são implementadas?

ATUALIZAR:

Eu sei que o atributo de campo opcional não serializa o valor mantido por um membro de dados, mas NonSerialized nem mesmo serializará o membro de dados ou seu valor.

Foi útil?

Solução

Esses dois atributos são usados ​​para lados opostos da equação de serialização.

Quando você usa [NonSerialized], você está dizendo "este campo não deve ser serializado" - então é mais um atributo "economizar tempo".Basicamente, você está dizendo que esse campo não importa para o estado serializado do objeto.

Quando você usa [OptionalField], por outro lado, você ainda serializará o campo.Porém, se o campo for ausente no tempo de leitura (quando o fluxo é desserializado em um objeto), nenhuma exceção será gerada.Este atributo tem como objetivo permitir que você adicione um novo campo a um tipo serializável existente, sem quebrar a compatibilidade.Versões mais antigas do objeto (que não possuem esse campo) serão desserializadas normalmente.

Outras dicas

Apenas brincando com a língua inglesa, não requerido e opcional significa a mesma coisa neste caso.

Para sua primeira pergunta, você acertou em cheio. [OptionalField] basicamente permite que serializações mais antigas sejam compatíveis com definições mais recentes. [NonSerialized] significa que você não o encontrará nos dados serializados.

Dadas as diferenças, não consigo imaginar por que você colocaria os dois em um único campo, mas acho que o compilador reclamaria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top