我有一個類型的數據集,我想表(其由.NET創建)或行而不是對象(我將被創建)的集合或對象的收集傳遞到客戶端。 Silverlight框架不支持system.data.datatable。如何將datacontract添加到由類型化數據集創建的類型(xxxDataTable)?
回答
你不需要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,但你可以使用自己的序列化的字典)
我傳遞的數據沒有序列化,它工作得很好。我在尋找各種方法來傳遞對象,而不對 – 2013-03-04 15:41:09
您可以實現轉換的通用方法的任何實體的每個實體創建的類層次結構設置詞典<字符串,對象> – SalientBrain 2013-03-04 18:03:51
這就是我做的。我想要做的是使「該字典中的對象」成爲由類型化數據集創建的類型的實例。 – 2013-03-05 07:23:03
你根本無法,使用T他在您的Silverlight客戶端中使用ADO.NET實現DataTable,但還有其他選擇。
然而,this blog post有一個替代的DataTable實現,你可以序列化和可在Silverlight支持。
這與簡單數據表類似,但沒有鍵入數據集「實體」類。 – SalientBrain 2013-03-03 17:53:19
我傳遞的數據沒有序列化,它工作得很好。我正在尋找方法來傳遞對象而不爲每個實體創建類 – 2013-03-04 15:41:55
如果你想在你應該使用RIA服務的Silverlight應用程序來訪問數據。您應該創建自定義DTO對象,並從DataTable行創建DTO對象列表並從RIA服務中返回。
你開始使用RIA服務遵循MSDN在http://msdn.microsoft.com/en-us/library/ee707376(v=vs.91).aspx
- 1. 將數據添加到類型化數據集編程
- 2. 類型化數據集和非類型化數據集
- 3. VS2015 CE SQLite - 如何創建一個類型化的數據集
- 4. 將繼承類型的DataContract序列化爲基類型
- 5. 如何將'set'數據類型添加到Django模型中?
- 6. 如何創建可以初始化C++數據類型的類?
- 7. 我可以將WCF DataContract添加到複雜類型嗎?
- 8. 將dummy列添加到強類型數據集
- 9. 如何將oracle數據類型映射到java數據類型?
- 10. 如何將Mime類型添加到MimetypesFileTypeMap?
- 11. 如何將構造函數添加到子類數字類型?
- 12. 如何將值添加到類類型的命名數組?
- 13. 如何將PL/SQL數據類型BINARY_INTEGER物化爲Java類型?
- 14. 如何創建數據子類型
- 15. 創建Set數據類型
- 16. C數據類型創建
- 17. 如何將屬性添加到由數據模型文件創建的NSManagedObject子類?
- 18. 如何創建泛型類型類
- 19. 如何將現有數據類型添加到SharePoint功能schema.xml
- 20. 如何類型參數添加到XAML
- 21. 創建一個泛型集合到一個不能添加指定的類型
- 22. 將類型限制添加到多個類型參數?
- 23. 如何將類型方法添加到Swift中的泛型類型?
- 24. 如何將不透明類型添加到集合
- 25. 強類型數據集的序列化
- 26. 插入的類型化數據集ConstraintException
- 27. 使用類型化數據集的TransactionScope
- 28. 類型化數據集中的事務
- 29. 帶有類型化數據集的TransactionScope
- 30. 如何創建具有通用值類型參數的類型的集合
你不能做到這一點。 – 2013-02-27 07:10:49
好問題是答案的一半。如果框架不支持它,這是不可能的。如果類型在框架中不可用,WCF將無濟於事。 – 2013-03-01 22:22:34
讓我解決這個問題。你在服務器上有一些TypedDataSet,你希望Silverlight在客戶端自動生成Types,然後你想將服務器上的TypedDataSet序列化爲一個字節流,並在客戶端反序列化它? – 2013-03-05 14:22:51