如何将datacontract添加到由类型化数据集创建的类型(xxxDataTable)?

时间:2013-02-26 14:32:14

标签: wcf silverlight datatable datacontract datamember

我有一个类型化数据集,我想传递表(由.net创建)或行集合而不是对象(我将创建)或对象集合到客户端。 Silverlight框架不支持system.data.datatable。

3 个答案:

答案 0 :(得分:1)

您不需要将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不是很好,但您可以使用自己的可序列化字典)

答案 1 :(得分:0)

您根本无法在Silverlight客户端中使用DataTable的ADO.NET实现,但也有其他选择。

但是,this blog post有一个替代的DataTable实现,您可以在Silverlight中对其进行序列化并支持。

答案 2 :(得分:0)

如果要访问Silverlight应用程序中的数据,则应使用RIA服务。您应该创建自定义DTO对象并从DataTable行创建DTO对象列表,并从RIA服务返回它。

您开始使用RIA服务,请访问MSDN http://msdn.microsoft.com/en-us/library/ee707376(v=vs.91).aspx

相关问题