我有一个类型的数据集,我想表(其由.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. VS2015 CE SQLite - 如何创建一个类型化的数据集
- 2. 将继承类型的DataContract序列化为基类型
- 3. 我可以将WCF DataContract添加到复杂类型吗?
- 4. 将dummy列添加到强类型数据集
- 5. 如何将构造函数添加到子类数字类型?
- 6. 如何将PL/SQL数据类型BINARY_INTEGER物化为Java类型?
- 7. 创建Set数据类型
- 8. 如何创建泛型类型类
- 9. 如何将现有数据类型添加到SharePoint功能schema.xml
- 10. 如何类型参数添加到XAML
- 11. 创建一个泛型集合到一个不能添加指定的类型
- 12. 如何将类型方法添加到Swift中的泛型类型?
- 13. 如何将不透明类型添加到集合
- 14. 类型化数据集中的事务
- 15. 使用类型化数据集的TransactionScope
- 16. 强类型数据集的序列化
- 17. 带有类型化数据集的TransactionScope
- 18. 插入的类型化数据集ConstraintException
- 19. 如何创建具有通用值类型参数的类型的集合
- 20. 将附加数据添加到由Django串化器返回的模型数据
- 21. 泛型:创建参数化类参数
- 22. 如何添加自定义类型到莳萝的pickleable类型
- 23. 创建内容类型时将标签添加到复选框
- 24. 如何将自定义构建类型添加到cmake?
- 25. 动态定义类型化数据集?
- 26. 强类型数据集 - XML序列化
- 27. 如何获取PowerShell添加类型使用添加类型
- 28. 将域模型类型的数据绑定到ViewModel类型
- 29. 创建在C#类型“类型”的对象的自己的集合类型
- 30. 如何创建类型
你不能做到这一点。 – 2013-02-27 07:10:49
好问题是答案的一半。如果框架不支持它,这是不可能的。如果类型在框架中不可用,WCF将无济于事。 – 2013-03-01 22:22:34
让我解决这个问题。你在服务器上有一些TypedDataSet,你希望Silverlight在客户端自动生成Types,然后你想将服务器上的TypedDataSet序列化为一个字节流,并在客户端反序列化它? – 2013-03-05 14:22:51