- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
长话短说;是否有库或协议(protocol)允许我从 .NET 应用程序序列化一些数据并在 WP、Win8、iOS 和 Android 上反序列化,同时保留对象之间的引用,因为它们在代码中,即如果单个实例 X 是 Y 的成员并且Z 当 Y 和 Z 被反序列化时,应该只有一个 X 对象。
详细版本:
我希望能够序列化一些类型 A 和 B 的对象,其中 A 具有类型 B 的成员,并且 B 的一个实例可以是 A 的多个实例的成员。我应该能够在 WP、Win8 上反序列化, iOS 和 Android 以及反序列化数据时应保持相同的关系。遗憾的是,我现在无法在 Android 和 iOS 上进行测试。
对序列化机制的要求
[DataContract(IsReference = true)]
public class A
{
[DataMember]
public string Name { get; set; }
[DataMember]
public B MemberB { get; set; }
}<p></p>
<p>[DataContract(IsReference = true)]
public class B
{
[DataMember]
public string Name { get; set; }
}
</p>
示例对象图:
var b1 = new B { Name = "B1" };
var aa = new List { new A { MemberB = b1, Name = "A1" }, new A { MemberB = b1, Name = "A2" } };
我已尝试使用 DataContract 序列化并将 IsReference = true 添加到 DataContract 属性。这就像桌面 .NET 和 WP 之间的魅力一样,我认为它可以在 Windows 8 上运行,但我什至找不到在 iOS 和 Android 上反序列化 DataContractSerialization 的方法,而无需编写我自己的反序列化程序,更不用说开箱即用的保留引用支持了.如果有一个库可以在 iOS 和 Android 上提供反序列化而无需额外的努力,那么 DataContract 序列化对我来说将是完美的。
我还试验了 OData 服务。 OData 有 client libraries适用于 iOS 和 Android,但它是否按预期工作。似乎如果在实体引用上有 PK 将被保留。我像这样在 WP 和 .NET 控制台应用程序上进行了测试:
DemoService service = new DemoService(new Uri("http://services.odata.org/OData/OData.svc/"));
var productsQuery = (DataServiceQuery<Product>)
(from p in service.Products.Expand("Category")
where p.Category.ID == 1
select p);
productsQuery.BeginExecute(
(result) =>
{
var actualProducts = productsQuery.EndExecute(result).ToList();
System.Diagnostics.Debug.WriteLine(actualProducts[2].Category == actualProducts[4].Category); //outputs true because both categories are the same
},
null);
它似乎有效,但我的测试是否正确,它是否适用于 iOS 和 Android 客户端?我想避免使用 OData,因为它对我来说太重了。
我知道我可以给每个对象一个 ID,并且只使用这些 ID 来建模对象图,但我希望有一个更简洁的解决方案。我也想避免编写自己的序列化代码。
子问题:
感谢您的宝贵时间。
最佳答案
我会使用 protocol buffers来自谷歌。还有其他语言的其他实现,包括 Objective C 和 C#。
更新:
如果我这样做,我会首先在所有地方使用 .NET,包括在 Android 上(通过使用 MonoDroid)和(在 iOS 上使用 MonoTouch)。是的,您现在可以跨任何平台共享 C# 代码!
我希望序列化的每个对象都有一个定义为 Protocol-Buffer 对象的等效对象。每个对象都有一个序列化的哈希值作为它的 ID。对象中的每个引用都将定义为哈希值。
然后,您在每个对象中都有一些代码来遍历它下面的对象,并在遍历过程中序列化到 Protocol Buffer 对象。填充哈希值引用。
如果不存在,每个对象引用都会被查找并存储在对象的字典(哈希值/地址)中。这个也是连载的。这会阻止您将对象序列化两次,因为对象在整个操作中仅被序列化/反序列化一次。这是通过设置/清除对象在字典中的地址来完成的。
我以前写过这些东西,这没什么大不了的。
关于android - 如何在 .NET 上序列化和在 WP、Win8、iOS 和 Android 上反序列化并保留引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265857/
我是一名优秀的程序员,十分优秀!