Я ищу простой способ проверить, сериализуем ли объект в C #.
Как мы знаем, вы можете сделать объект сериализуемым, реализуя интерфейс ISerializable или поместив [Serializable] в начало класса.
Я ищу быстрый способ проверить это без необходимости отражать класс, чтобы получить его атрибуты. Интерфейс будет быстрым, используя оператор is .
Используя предложение @Flard, это код, который я придумал, крик, есть ли лучший способ.
private static bool IsSerializable(T obj)
{
return ((obj is ISerializable) || (Attribute.IsDefined(typeof (T), typeof (SerializableAttribute))));
}
Или, что еще лучше, просто получите тип объекта и затем используйте свойство IsSerializable для этого типа:
typeof(T).IsSerializable
Помните, что это, похоже, только тот класс, с которым мы имеем дело, если класс содержит другие классы, вы, вероятно, захотите проверить их все или попытаться сериализовать и дождаться ошибок, как указал @pb.
c#
serialization
FryHard
источник
источник
Ответы:
У вас есть прекрасная недвижимость в
Type
названном классеIsSerializable
.источник
Вам нужно будет проверить все типы в графе сериализуемых объектов на предмет сериализуемого атрибута. Самый простой способ - попытаться сериализовать объект и перехватить исключение. (Но это не самое чистое решение). Type.IsSerializable и проверка атрибута serializalbe не учитывают график.
Образец
источник
Это старый вопрос, который, возможно, потребуется обновить для .NET 3.5+. Type.IsSerializable может фактически вернуть false, если класс использует атрибут DataContract. Вот фрагмент, который я использую, если он воняет, дайте мне знать :)
источник
null
проверку и вернуть, еслиtrue
?Используйте Type.IsSerializable, как указывали другие.
Вероятно, не стоит пытаться отразить и проверить, все ли члены в графе объектов сериализуемы.
Член может быть объявлен как сериализуемый тип, но фактически может быть создан как производный тип, который не является сериализуемым, как в следующем надуманном примере:
Следовательно, даже если вы определите, что конкретный экземпляр вашего типа является сериализуемым, вы, как правило, не можете быть уверены, что это будет верно для всех экземпляров.
источник
Возможно, предполагает отражение под водой, но самый простой способ?
источник
Вот вариант 3.5, который делает его доступным для всех классов, использующих метод расширения.
источник
Я взял ответ на этот вопрос и ответ здесь и изменил его, чтобы вы получили Список типов, которые не сериализуемы. Таким образом, вы легко узнаете, какие из них отметить.
А потом вы называете это ...
Когда он запускается, nonSerializableTypes будет иметь список. Возможно, это лучший способ сделать это, чем передать пустой список рекурсивному методу. Кто-нибудь поправьте меня, если так.
источник
Объект исключения может быть сериализуемым, но с использованием другого исключения, которого нет. Это то, что у меня было только что с WCF System.ServiceModel.FaultException: FaultException можно сериализовать, а ExceptionDetail - нет!
Итак, я использую следующее:
источник
Мое решение в VB.NET:
Для объектов:
Для типов:
источник