Usando o C # .NET 2.0, tenho uma classe de dados composta que possui o [Serializable]
atributo. Estou criando uma XMLSerializer
classe e passando isso para o construtor:
XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
Estou recebendo uma exceção dizendo:
Ocorreu um erro ao refletir o tipo.
Dentro da classe de dados, há outro objeto composto. Isso também precisa ter o [Serializable]
atributo ou, ao tê-lo no objeto superior, aplica-o recursivamente a todos os objetos internos?
IList
quando precisava serList
.Lembre-se de que as classes serializadas devem ter construtores padrão (ou seja, sem parâmetros). Se você não tem construtor, tudo bem; mas se você tiver um construtor com um parâmetro, precisará adicionar o padrão também.
fonte
Eu tive um problema semelhante, e o serializador não conseguiu distinguir entre duas classes que eu tinha com o mesmo nome (uma era uma subclasse da outra). A exceção interna era assim:
'Types BaseNamespace.Class1' e 'BaseNamespace.SubNamespace.Class1' usam o nome do tipo XML, 'Class1', do namespace ''. Use atributos XML para especificar um nome XML exclusivo e / ou espaço para nome para o tipo.
Onde BaseNamespace.SubNamespace.Class1 é uma subclasse de BaseNamespace.Class1.
O que eu precisava fazer era adicionar um atributo a uma das classes (adicionei à classe base):
Nota: Se você tiver mais camadas de classes, precisará adicionar um atributo a elas também.
fonte
Também esteja ciente de que
XmlSerializer
não é possível serializar propriedades abstratas. Veja minha pergunta aqui (à qual adicionei o código da solução) ..Serialização XML e tipos herdados
fonte
Razões mais comuns por mim:
fonte
Todos os objetos no gráfico de serialização precisam ser serializáveis.
Como
XMLSerializer
é uma caixa preta, verifique esses links se desejar depurar ainda mais o processo de serialização.Alterando onde o XmlSerializer gera assemblies temporários
COMO: Depurar em um assembly gerado pelo .NET XmlSerializer
fonte
Se você precisar lidar com atributos específicos (por exemplo, Dictionary ou qualquer classe), poderá implementar a interface IXmlSerialiable , que permitirá mais liberdade ao custo de uma codificação mais detalhada .
Há um artigo interessante , que mostra uma maneira elegante de implementar uma maneira sofisticada de "estender" o XmlSerializer.
O artigo diz:
Por isso, sugiro implementar suas próprias
IXmlSerializable
classes, a fim de evitar implementações muito complicadas.... poderia ser simples implementar nossa
XmlSerializer
classe personalizada usando reflexão.fonte
Descobri que a classe Dictionary .Net 2.0 não é serializável usando XML, mas serializa bem quando a serialização binária é usada.
Encontrei um trabalho por aqui .
fonte
Recentemente, obtive isso em uma classe parcial de referência da Web ao adicionar uma nova propriedade. A classe gerada automaticamente estava adicionando os seguintes atributos.
Eu precisava adicionar um atributo semelhante com um pedido superior ao último na sequência gerada automaticamente e isso foi corrigido para mim.
fonte
Acabei de receber o mesmo erro e descobri que uma propriedade do tipo
IEnumerable<SomeClass>
era o problema. Parece queIEnumerable
não pode ser serializado diretamente.Em vez disso, pode-se usar
List<SomeClass>
.fonte
Eu também pensei que o atributo Serializable tinha que estar no objeto, mas, a menos que eu esteja sendo um noob completo (estou no meio de uma sessão de codificação tarde da noite), os seguintes trabalhos do SnippetCompiler :
Eu imaginaria que o XmlSerializer está usando a reflexão sobre as propriedades públicas.
fonte
Eu tive uma situação em que a ordem era a mesma para dois elementos seguidos
.... algum código ...
Quando alterei o código para incrementar o pedido em um para cada nova propriedade da classe, o erro desapareceu.
fonte
Eu estava recebendo o mesmo erro quando criei uma propriedade com um tipo de dados -
Type
. Por isso, estava recebendo um erro - houve um erro ao refletir o tipo. Continuei verificando a 'InnerException' de todas as exceções do dock de depuração e obtive o nome do campo específico (que eraType
) no meu caso. A solução é a seguinte:fonte
Observe também que você não pode serializar controles da interface do usuário e que qualquer objeto que você deseja passar para a área de transferência deve ser serializável, caso contrário, não poderá ser transmitido para outros processos.
fonte
Eu tenho usado a
NetDataSerialiser
classe para serializar minhas classes de domínio. Classe NetDataContractSerializer .As classes de domínio são compartilhadas entre cliente e servidor.
fonte
Eu tive o mesmo problema e, no meu caso, o objeto tinha um ReadOnlyCollection. Uma coleção deve implementar o método Add para ser serializável.
fonte
Eu tenho uma solução um pouco diferente de tudo descrito aqui até agora, portanto, para qualquer civilização futura, aqui está a minha!
Eu havia declarado um tipo de dados "time" como o tipo original era a
TimeSpan
e, posteriormente, alterado para aString
:no entanto, o tipo real era uma string
removendo a
DateType
propriedadeXml
pode ser serializadafonte
Ou
fonte