gpt4 book ai didi

android - 如何在 .NET 上序列化和在 WP、Win8、iOS 和 Android 上反序列化并保留引用

转载 作者:行者123 更新时间:2023-11-29 18:08:08 25 4
gpt4 key购买 nike

长话短说;是否有库或协议(protocol)允许我从 .NET 应用程序序列化一些数据并在 WP、Win8、iOS 和 Android 上反序列化,同时保留对象之间的引用,因为它们在代码中,即如果单个实例 X 是 Y 的成员并且Z 当 Y 和 Z 被反序列化时,应该只有一个 X 对象。

详细版本:

我希望能够序列化一些类型 A 和 B 的对象,其中 A 具有类型 B 的成员,并且 B 的一个实例可以是 A 的多个实例的成员。我应该能够在 WP、Win8 上反序列化, iOS 和 Android 以及反序列化数据时应保持相同的关系。遗憾的是,我现在无法在 Android 和 iOS 上进行测试。

对序列化机制的要求

  • 反序列化时保留对象引用
  • 序列化的开销并不重要,因为设备会像每三个月获取一次新数据
  • 虽然开销并不重要,但重要的是不要对同一对象的引用进行多次序列化,因为这会导致非常大的序列化数据。
  • 能够使用 .NET 进行序列化。不需要在其他平台上序列化。
  • 能够在WP、Win8、iOS、Android上反序列化


[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 来建模对象图,但我希望有一个更简洁的解决方案。我也想避免编写自己的序列化代码。

子问题:

  1. 有没有办法在 iOS 和 Android 上反序列化 DataContract Serialization 而无需编写我自己的反序列化器
  2. iOS 和 Android 的 OData 客户端是否保留对象引用?他们容易相处吗
  3. iOS 版 Mono 和 Android 版 Mono 是否在保留对象引用的同时支持 DataContract 反序列化?

感谢您的宝贵时间。

最佳答案

我会使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com