#c# #generics #serialization
#c# #обобщения #сериализация
Вопрос:
Если у меня есть объекты со свойствами типа object или объекты, являющиеся общими, как я могу это сериализовать?
Например.
public class MyClass
{
public Object Item { get; set; }
}
или
public class MyClass<T>
{
public T Item { get; set; }
}
Редактировать
Мой универсальный класс теперь выглядит следующим образом:
public class MyClass<T>
{
public MySubClass<T> SubClass { get; set; }
}
public class MySubClass<T>
{
public T Item { get; set; }
}
Дополнительный вопрос: Как я могу изменить имя элемента для Item во время выполнения на typeof(T).Name?
Ответ №1:
Вы пробовали использовать [Serializable]
атрибут?
[Serializable]
public class MySerializableClass
{
public object Item { get; set; }
}
[Serializable]
public class MySerializableGenericClass<T>
{
public T Item { get; set; }
}
Хотя универсальный класс сериализуем только в том случае, если параметр универсального типа также сериализуем.
Afaik нет способа ограничить параметр type сериализуемым. Но вы можете проверить во время выполнения, используя статический конструктор:
[Serializable]
public class MySerializableGenericClass<T>
{
public T Item { get; set; }
static MySerializableGenericClass()
{
ConstrainType(typeof(T));
}
static void ConstrainType(Type type)
{
if(!type.IsSerializable)
throw new InvalidOperationException("Provided type is not serializable");
}
}
Комментарии:
1. Я хочу изменить имя элемента MySerializableGenericClass<T> . Элемент для type.name из T. Как это можно сделать?
2. Был ли мой ответ полезным? Вы можете определить, отметив (приняв) это. Тогда я буду рад обсудить ваш второй вопрос.
Ответ №2:
Используйте эти методы для сериализации десериализации любого объекта (даже общих) в XML-файл, хотя они могут быть изменены для других целей:
public static bool SerializeTo<T>(T obj, string path)
{
XmlSerializer xs = new XmlSerializer(obj.GetType());
using (TextWriter writer = new StreamWriter(path, false))
{
xs.Serialize(writer, obj);
}
return true;
}
public static T DeserializeFrom<T>(string path)
{
XmlSerializer xs = new XmlSerializer(typeof(T));
using (TextReader reader = new System.IO.StreamReader(path))
{
return (T)xs.Deserialize(reader);
}
}