Serialization WP7中的序列化-我遗漏了什么?

Serialization WP7中的序列化-我遗漏了什么?,serialization,windows-phone-7,Serialization,Windows Phone 7,由于逻辑删除,序列化对于WP7应用程序来说非常重要。基于位置的应用程序风靡一时。但当我试图将GeoCoordination放入隔离的存储设置时,它后来未能再水化,我最终独立地序列化了lat和lng,这是非常不令人满意的,因为我最终得到了大量的临时序列化代码。我已经用反射清理了一些,但实际上它是一个大烂摊子 这是怎么回事?有没有我还没有学会的正确方法 如果不是,那么GeoCoordinate类的作者们在想什么?带有DataMember属性的注释就是它所能做的一切。他们是否从未想过位置可能是WP7应

由于逻辑删除,序列化对于WP7应用程序来说非常重要。基于位置的应用程序风靡一时。但当我试图将GeoCoordination放入隔离的存储设置时,它后来未能再水化,我最终独立地序列化了lat和lng,这是非常不令人满意的,因为我最终得到了大量的临时序列化代码。我已经用反射清理了一些,但实际上它是一个大烂摊子

这是怎么回事?有没有我还没有学会的正确方法

如果不是,那么GeoCoordinate类的作者们在想什么?带有DataMember属性的注释就是它所能做的一切。他们是否从未想过位置可能是WP7应用程序状态的一部分

我已经在上看过这篇文章,以及它链接到一个相当基本的DIY二进制序列化助手(微软的BinaryFormatter类不可用)


芒果包括Silverlight4,或者我被告知(我的笔记本内存不足,必须遵守的她禁止我在8月滑雪旅行后再构建更大的系统)-有人知道这是否意味着二进制格式化程序将可用吗?我可以复制BinaryFormatter,但我宁愿不复制。

除非我误解了你的意思,你能不能把地理坐标的值转换成一个自定义的、可序列化的对象?再水化就是简单地反序列化对象并创建一个新的地理坐标对象


我不确定BinaryFormatter在Mango工具包中是否可用,但Mango工具包已经推出(测试版),因此您可以使用。

尽管我认为Microsoft应该运用一些常识,确保GeoCoordinate之类的类是DataContract可序列化的,但我找到了一个方便的解决方法。通常,在执行此类工作时,会导入BingRoute Web服务或类似服务的接口

显然,其中的所有类都是可序列化的,因此我将所有代码转换为使用
BingRoute.Location
类型,而不是
geocordination
,问题就消失了。必要时,扩展方法
togeocordination()
可以使转换足够不引人注目,从而不影响现有代码的意图

public static GeoCoordinate ToGeoCoordinate(this BingRoute.Location loc)
{
  return new GeoCoordinate(loc.Latitude, loc.Longitude, loc.Altitude);
}
如果您接受我的建议,那么迟早会错过GeoCoordinate的GetDistanceTo()方法。扩展方法在这里也是你的朋友

您可以将这两个点转换为
geocordination
,并使用内置方法,但这将产生大量瞬态对象,并且在垃圾收集器执行其职责时,您的应用程序将在某个时候阻塞

为了更好的测量,我加入了另一个内置位置类型。请注意,距离代码实现了Haversine,这是一个具有许多限制的大圆计算。警告买主

public static double GetDistanceTo(this BingRoute.Location A, BingRoute.Location B)
{
  return GetDistanceTo(A.Latitude, A.Longitude, B.Latitude, B.Longitude);
}

public static double GetDistanceTo(
  this Microsoft.Phone.Controls.Maps.Platform.Location A, 
  Microsoft.Phone.Controls.Maps.Platform.Location B)
{
  return GetDistanceTo(A.Latitude, A.Longitude, B.Latitude, B.Longitude);
}

static double toRad = Math.PI / 180D;
static double toDeg = 180D / Math.PI;

static double GetDistanceTo(double lat1, double lng1, double lat2, double lng2)
{
  lat1 *= toRad;
  lng1 *= toRad;
  lat2 *= toRad;
  lng2 *= toRad;
  double sin_dLng_on2_squared = Math.Sin((lng2 - lng1) / 2);
  sin_dLng_on2_squared *= sin_dLng_on2_squared;
  double sin_dLat_on2_squared = Math.Sin((lat2 - lat1) / 2);
  sin_dLat_on2_squared *= sin_dLat_on2_squared;
  double a = sin_dLat_on2_squared + Math.Cos(lat1 * Math.Cos(lat2) * sin_dLng_on2_squared);
  double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));
  return c * 6371000;
}

还需要注意的是,存储越多,应用程序启动越慢,因为在激活时创建设置对象需要更长的时间。因此,最好只在此处存储简单的选项状态,并尽可能多地保存在独立的存储文件中

您是对的,我可以将GeoCoordinate的各种成员值复制到另一个具有适当DataContract属性的对象中,以便与IsolatedStorageSettings.ApplicationSettings一起使用。人们甚至可以通过实现GeoCoordinate序列化和反序列化作为扩展方法来整理这一点,不过这是临时的。它只解决了一个类的问题。