【问题标题】:.Net - serialize objects.Net - 序列化对象
【发布时间】:2011-05-24 14:28:13
【问题描述】:

如果我有对象类型的属性或泛型对象,我该如何序列化它?

例如。

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?

【问题讨论】:

    标签: c# generics serialization


    【解决方案1】:

    你试过[Serializable]属性吗?

    [Serializable]
    public class MySerializableClass
    {
       public object Item { get; set; }
    }
    
    [Serializable]
    public class MySerializableGenericClass<T>
    {
       public T Item { get; set; }
    }
    

    虽然泛型类只有在泛型类型参数也是可序列化的情况下才能序列化。

    Afaik 无法将类型参数限制为可序列化。但是您可以在运行时使用静态构造函数进行检查:

    [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");
       }
    }
    

    【讨论】:

    • 我想把 MySerializableGenericClass.Item 的元素名改成 T 的 type.name 怎么办?
    • 我的回答有帮助吗?您可以通过标记(接受)它来判断。那么我很乐意讨论你的第二个问题。
    【解决方案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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2016-05-13
      • 1970-01-01
      相关资源
      最近更新 更多