Класс может быть включен для сериализации, просто применив атрибут к его определению. И нет никакого способа в C# сделать ошибку времени компиляции, потому что в типе отсутствует атрибут, поэтому нет, вы не можете поймать попытки сериализации unserializable типа во время компиляции.
Если вы используете стандартные методы библиотеки для сериализации, любые попытки сериализации классов, которые не поддерживают его, будут создавать исключение, поэтому вам не нужно ничего делать, чтобы проверить это во время выполнения.
Также есть небольшая точка, делающая ваш общий метод обертки. Аргумент может быть любого типа, без ограничений, которые могли бы с пользой его ограничить, поэтому он может быть простым старым object
.
Однако, если вы избегаете встроенной среды сериализации .NET, вы можете разработать свой собственный, который проверяется временем компиляции. Вам нужно будет использовать систему типов соответствующим образом, то есть определить интерфейс, который должен реализовать любой сериализуемый тип. Тогда ваш метод SerializeToText
примет ссылку на этот интерфейс.
interface ICanSerialize
{
void Serialize(ISerializeMedium m);
}
interface ISerializeMedium
{
void Serialize(string name, ref int value);
void Serialize(string name, ref bool value);
void Serialize(string name, ref string value);
void Serialize<T>(string name, ref T value) where T : ICanSerialize;
void Serialize<T>(string name, ref ICollection<T> value) where T : ICanSerialize;
// etc.
}
сериализуемый тип будет выглядеть следующим образом:
class C : ICanSerialize
{
string _firstName;
bool _happy;
public void Serialize(ISerializeMedium m)
{
m.Serialize("firstName", ref _firstName);
m.Serialize("happy", ref _happy);
}
}
Тогда вам просто необходима реализация ISerializeMedium
. Такая структура накладывает безопасность типов на все виды использования сериализации с нуля, а не на то, чтобы последовать за ней, что невозможно.
Все это связано с определенным количеством переоборудования колес, но иногда вам требуется круглое колесо.
Довольно уверен, что это обман, и по крайней мере один ответ является точным обманом http: // stackoverflow.com/questions/81674/how-to-check-if-an-object-is-serializable-in-c –
Нет. Этот вопрос задает в первую очередь вопрос о проверке во время компиляции. Этот предыдущий вопрос задает только проверку времени выполнения. Многие из ответов здесь могут быть дубликатами, но только потому, что их авторы недостаточно внимательно читают этот вопрос! :) –