我有一个类型化的数据集,我想将表(由 .net 创建)或行集合而不是对象(我将创建)或对象集合传递到客户端。Silverlight 框架不支持 system.data.datatable。
3 回答
您不需要将 datacontract 属性添加到您不拥有的类型。您可以实现IDataContractSurrogate以将客户端未知类型的实例替换为已知类型的实例(例如轻量级数据表 POCO)。
如果您使用代码优先方法,您将不会在类型化数据集类对象和您自己的序列化/反序列化 POCO 对象之间进行这种额外的投影复制操作(并且您将完全控制数据对象类型 (POCO))。
我发现使用 Json.Net 'any object to 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 客户端中使用 DataTable 的 ADO.NET 实现,但有替代方法。
但是,这篇博文有一个替代的 DataTable 实现,您可以对其进行序列化并在 Silverlight 中提供支持。
如果您想访问 Silverlight 应用程序中的数据,您应该使用 RIA 服务。您应该创建自定义 DTO 对象并从 DataTable 行创建 DTO 对象列表并从 RIA 服务返回它。
您开始使用 RIA 服务遵循 MSDN,网址为http://msdn.microsoft.com/en-us/library/ee707376(v=vs.91).aspx