我正在编写一个自定义DataSourceControl
,它将基本上具有 Select 功能,就像正常工作一样ObjectDataSource
,具有 aTypeName
和SelectMethod
属性。
来自 TypeName 类的数据将保存在由参数值的哈希和 ContextName 索引的文件中。这意味着,每次 GridView 请求 DataSource 并给出相同的参数值时,控件都会找到相应的 File 并从那里加载数据。事实上,每个不同的参数值组合都会生成一个包含数据的新文件。
在某些情况下,当数据需要很长时间才能从数据库中处理和检索并且不需要对用户实时(总是从最后一天开始)时,此功能可能非常有用。
我遇到的主要困难是序列化来自 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);
}
我如何一般将 Select Method 结果序列化/反序列化为 XML?
更新:
我尝试使用System.Web.UI.LosFormatter
序列化/反序列化数据。它使用 IEnumerable 实例执行了这两个操作,但我必须将Serializable
属性放在实体上。XMLSerializer
但是,与从文件中检索数据时相比,我注意到性能存在显着差异。System.Web.UI.LosFormatter
在我的特定测试(4MB 文件)中反序列化速度慢了 4 倍。XMLSerializer
与tho相比,数据文件的大小将减少一半。所以,对我来说,XMLSerializer
仍然是最好的选择。
更新2:
尝试使用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<,>"
。有什么办法可以使这项工作?