2011-05-24 91 views
1

如果我的對象具有屬性類型的對象或對象是泛型,我該如何序列化這個?.Net - 序列化對象

例如,

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

產生額外的問題:我怎樣才能改變元素名稱項目在運行時到typeof(T).Name?

回答

6

您是否嘗試過[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"); 
    } 
} 
+0

我想更改MySerializableGenericClass的元素名稱 .Item爲type.name.T怎麼辦? – Sys 2011-05-25 08:52:06

+0

我的回答有用嗎?你可以通過標記(接受)來判斷。那麼我會很樂意討論你的第二個問題。 – 2011-05-25 10:13:04

1

使用這些方法來序列\反序列化的任何對象(甚至是仿製藥)到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); 
    } 
}