2013-02-26 72 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

相關問題