2013-02-26 70 views
0

我有一个类型的数据集,我想表(其由.NET创建)或行而不是对象(我将被创建)的集合或对象的收集传递到客户端。 Silverlight框架不支持system.data.datatable。如何将datacontract添加到由类型化数据集创建的类型(xxxDataTable)?

+0

你不能做到这一点。 – 2013-02-27 07:10:49

+1

好问题是答案的一半。如果框架不支持它,这是不可能的。如果类型在框架中不可用,WCF将无济于事。 – 2013-03-01 22:22:34

+0

让我解决这个问题。你在服务器上有一些TypedDataSet,你希望Silverlight在客户端自动生成Types,然后你想将服务器上的TypedDataSet序列化为一个字节流,并在客户端反序列化它? – 2013-03-05 14:22:51

回答

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,但你可以使用自己的序列化的字典)

+0

我传递的数据没有序列化,它工作得很好。我在寻找各种方法来传递对象,而不对 – 2013-03-04 15:41:09

+0

您可以实现转换的通用方法的任何实体的每个实体创建的类层次结构设置词典<字符串,对象> – SalientBrain 2013-03-04 18:03:51

+0

这就是我做的。我想要做的是使“该字典中的对象”成为由类型化数据集创建的类型的实例。 – 2013-03-05 07:23:03

0

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

然而,this blog post有一个替代的DataTable实现,你可以序列化和可在Silverlight支持。

+0

这与简单数据表类似,但没有键入数据集“实体”类。 – SalientBrain 2013-03-03 17:53:19

+0

我传递的数据没有序列化,它工作得很好。我正在寻找方法来传递对象而不为每个实体创建类 – 2013-03-04 15:41:55

相关问题