.Net — сериализация объектов

#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);
    }
}