我正在編寫基本上具有選擇功能的自定義,具有TypeName
和SelectMethod
屬性。自定義數據源控件上的數據序列化
來自TypeName類的數據將保存在由參數值和ContextName的哈希索引的文件中。這意味着,每當GridView請求數據源並給出相同的參數值時,控件就會找到相應的文件並從那裏加載數據。實際上,每個不同的參數值組合都會生成一個帶有數據的新文件。
時進行處理,並從數據庫中檢索到的數據時間過長,並不需要是實時的用戶此功能可以在某些情況下,我們有很大的幫助(它總是從最後一天)。
我遇到的主要困難是序列化來自SelectMethod的數據。作爲我唯一知道的是返回類型將是IEnumerable
的一個實例。我正在使用XMLSerializer
來保存和檢索文件中的數據內容,但是當試圖序列化時,它給我一個錯誤Cannot serialize interface
。
這是執行SelectMethod並執行序列化部分的基本代碼:
//Gets the select type
Type selectType = Type.GetType(TypeName);
//Gets the select method
MethodInfo selectMethod = selectType.GetMethod(SelectMethod, BindingFlags.Instance | BindingFlags.Public);
//Creates a new instance of the TypeName class
object selectInstance = Activator.CreateInstance(selectType);
//Executes the select method
object selectResult = selectMethod.Invoke(selectInstance, parameters);
IEnumerable list = (IEnumerable)selectResult;
//Create a serializer
XmlSerializer serializer = new XmlSerializer(typeof(IEnumerable));
//Writes to the XML file
using (XmlWriter writer = XmlWriter.Create(filePath))
{
serializer.Serialize(writer, list);
}
我會用這個代碼進行反序列化:
//Creates the XML File
XmlSerializer deserializer = new XmlSerializer(typeof(IEnumerable));
IEnumerable list = null;
//Reads from the XML file
using (XmlReader writer = XmlReader.Create(filePath))
{
list = (IEnumerable) deserializer.Deserialize(writer);
}
哪能一般序列化/反序列化的選擇方法結果爲XML?
更新:
我試着用System.Web.UI.LosFormatter
,以序列化/反序列化的數據。它使用IEnumerable實例完成了兩個操作,但我必須將Serializable
屬性放在實體上。但是,從XMLSerializer
的文件中檢索數據時,我注意到性能上的顯着差異。 System.Web.UI.LosFormatter
在我的特定測試(4MB文件)上進行反序列化時速度降低了4倍。與XMLSerializer
壽相比,數據文件的大小是其一半。所以,對我而言,XMLSerializer
仍然是最佳選擇。
UPDATE2:
把我的使用ServiceStack JsonSerializer
用下面的代碼一個簡單的測試:
List<Dummy> dummies = new List<Dummy>();
dummies.Add(new Dummy() { Name = "name" });
dummies.Add(new Dummy() { Name = "name1" });
dummies.Add(new Dummy() { Name = "name2" });
IEnumerable enumerableThing = dummies;
string filePath = Path.Combine(Server.MapPath("~/App_Data"), "data2.json");
using (StreamWriter writer = new StreamWriter(filePath))
{
JsonSerializer.SerializeToWriter<IEnumerable>(enumerableThing, writer);
}
using (StreamReader reader = new StreamReader(filePath))
{
enumerableThing = JsonSerializer.DeserializeFromReader<IEnumerable>(reader);
}
它的工作序列化,而是試圖DeserializeFromReader時,它給我的錯誤"Type System.Collections.IEnumerable is not of type IDictionary<,>"
。 有什麼辦法可以讓這項工作?
由於y你在ASP.NET上下文中工作,你可以使用LosFormatter而不是XmlSerializer(如果你不需要數據是人類可讀的)。優點是它非常自動化並且具有「網絡感知」功能,並且支持的類型與Web控件屬性一致。看到這裏:http://www.west-wind.com/weblog/posts/2006/Oct/13/LosFormatter-for-easy-Serialization –
@ Simon Mourier,感謝您的評論,更新了與內容相關的答案LosFormatter。 –
我認爲XmlSerializer速度更快的原因是因爲Xml序列化是在臨時彙編中自動編譯的,順便說一句,這就是爲什麼它不是非常靈活/自動/多功能。 –