Estou procurando uma maneira fácil de verificar se um objeto em C # é serializável.
Como sabemos, você torna um objeto serializável implementando a interface ISerializable ou colocando o [Serializable] no topo da classe.
O que estou procurando é uma maneira rápida de verificar isso sem ter que refletir a classe para obter seus atributos. A interface seria rápida usando uma instrução is .
Usando a sugestão de @ Flard, este é o código que eu criei, grite se existe uma maneira melhor.
private static bool IsSerializable(T obj)
{
return ((obj is ISerializable) || (Attribute.IsDefined(typeof (T), typeof (SerializableAttribute))));
}
Ou melhor ainda, obter o tipo do objeto e usar a propriedade IsSerializable no tipo:
typeof(T).IsSerializable
Lembre-se de que isso parece apenas para a classe com a qual estamos lidando, se a classe contiver outras classes, você provavelmente deseja verificar todas ou tentar serializar e aguardar os erros como @pb apontado.
fonte
Respostas:
Você tem uma linda propriedade na
Type
classe chamadaIsSerializable
.fonte
Você terá que verificar todos os tipos no gráfico de objetos sendo serializados para o atributo serializável. A maneira mais fácil é tentar serializar o objeto e capturar a exceção. (Mas essa não é a solução mais limpa). Type.IsSerializable e a verificação do atributo serializalbe não levam o gráfico em consideração.
Amostra
fonte
Esta é uma questão antiga, que pode precisar ser atualizada para .NET 3.5+. Type.IsSerializable pode realmente retornar false se a classe usar o atributo DataContract. Aqui está um trecho que eu uso, se fede, me avise :)
fonte
null
verificação e retornar setrue
?Use Type.IsSerializable como outros apontaram.
Provavelmente não vale a pena tentar refletir e verificar se todos os membros no gráfico do objeto são serializáveis.
Um membro pode ser declarado como um tipo serializável, mas na verdade ser instanciado como um tipo derivado que não é serializável, como no seguinte exemplo inventado:
Portanto, mesmo se você determinar que uma instância específica do seu tipo é serializável, em geral não pode ter certeza de que isso será verdadeiro para todas as instâncias.
fonte
Provavelmente envolve reflexão subaquática, mas da maneira mais simples?
fonte
Aqui está uma variação do 3.5 que o torna disponível para todas as classes usando um método de extensão.
fonte
Peguei a resposta a esta pergunta e a resposta aqui e modifiquei para obter uma lista de tipos que não são serializáveis. Dessa forma, você pode saber facilmente quais marcar.
E então você chama isso ...
Quando for executado, nonSerializableTypes terá a lista. Pode haver uma maneira melhor de fazer isso do que passar uma lista vazia para o método recursivo. Alguém me corrija se for assim.
fonte
O objeto de exceção pode ser serializável, mas usando uma outra exceção que não é. Isso é o que acabei de obter com WCF System.ServiceModel.FaultException: FaultException é serializável, mas ExceptionDetail não!
Portanto, estou usando o seguinte:
fonte
Minha solução, em VB.NET:
Para objetos:
Para tipos:
fonte