私は、DataSourceControl
基本的にSelect機能が通常どおりObjectDataSource
に機能し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);
}
Select Methodの結果を一般的にXMLにシリアル化/逆シリアル化するにはどうすればよいですか?
アップデート:
System.Web.UI.LosFormatter
データのシリアル化/逆シリアル化にを使用してみました。IEnumerableインスタンスで両方のアクションを実行しましたがSerializable
、エンティティに属性を設定する必要がありました。XMLSerializer
ただし、ファイルからデータを取得する場合と比較して、パフォーマンスに大きな違いがあることに気付きました。System.Web.UI.LosFormatter
私の特定のテスト(4MBファイル)での逆シリアル化では4倍遅くなりました。XMLSerializer
データファイルは、 thoと比較して半分のサイズになります。だから、私にとっては、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<,>"
。これを機能させる方法はありますか?