型指定されたデータ セットがあり、テーブル (.net によって作成される) またはオブジェクト (作成する) またはオブジェクトのコレクションの代わりに行のコレクションをクライアント側に渡したいと考えています。Silverlight フレームワークは system.data.datatable をサポートしていません。
3 に答える
所有していない型に datacontract 属性を追加する必要はありません。IDataContractSurrogateを実装して、クライアントが不明な型のインスタンスを既知の型のインスタンス (軽量データテーブル POCO など) に置き換えることができます。
コード ファーストのアプローチを使用した場合、型指定されたデータセット クラス オブジェクトと、シリアル化/逆シリアル化の独自の POCO オブジェクトとの間で、この余分な射影コピー操作を行う必要はありません (また、データ オブジェクト型 (POCO) を完全に制御できます)。
他の何かに変換する前の最初のステップとして、Json.Net の「任意のオブジェクトから JObject への」コンバーター (非常に高速でカスタマイズ可能) を使用すると便利です。
public static class JsonExtensions
{
public static object Normalize(this JToken token)
{
var type = token.GetType();
if (type == typeof(JObject))
{
return (token as JObject).OfType<JProperty>().ToDictionary<JProperty, string, object>(property => property.Name, property => property.Value.Normalize());
}
if (type == typeof(JProperty))
{
var property = token as JProperty;
//return new DictionaryEntry(property.Name, property.Value.Normalize());
return new KeyValuePair<string, object>(property.Name, property.Value.Normalize());
}
if (type == typeof(JValue))
{
return (token as JValue).Value;
}
if (type == typeof(JArray))
{
//return (token as JArray).OfType<JValue>().Select(value => value.Normalize()).ToArray();
return (token as JArray).Select(value => value.Normalize()).ToArray();
}
throw new NotImplementedException();
//return null;
}
}
public class TestClass
{
public string StringProperty { get; set; }
public int IntProperty { get; set; }
public TestClass RefProperty { get; set; }
}
private static string DataContractXmlSerialize<T>(T source)
{
var serializer = new DataContractSerializer(source.GetType());
using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, source);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
使用法:
var test = new TestClass()
{
StringProperty = "StringProperty",
IntProperty = int.MaxValue,
RefProperty = new TestClass() { IntProperty = int.MinValue }
};
var jObj = JObject.FromObject(test);
var dict = jObj.Normalize();
var serializedDict = DataContractXmlSerialize(dict);
ご覧のとおり - 出力は WCF シリアル化可能です (シリアル化されている標準の辞書はあまり適切な xml を生成しませんが、独自のシリアル化可能な辞書を使用できます)
Silverlight アプリケーションのデータにアクセスする場合は、RIA サービスを使用する必要があります。カスタム DTO オブジェクトを作成し、DataTable 行から DTO オブジェクトのリストを作成して、RIA サービスから返す必要があります。
RIA サービスを開始するには、MSDN ( http://msdn.microsoft.com/en-us/library/ee707376(v=vs.91).aspx ) に従ってください
Silverlight クライアントで DataTable の ADO.NET 実装を使用することはできませんが、代替手段はあります。
ただし、このブログ投稿には、Silverlight でシリアル化およびサポートできる代替の DataTable 実装があります。