Сериализация в WP7 - чего мне не хватает? - PullRequest
1 голос
/ 01 июня 2011

Что с надгробием, сериализация довольно важна для приложений WP7.И приложения, основанные на местоположении, все в моде.Но когда я попытался поместить GeoCoordinate в параметры изолированного хранилища, он не смог выполнить регидратацию позже, и я закончил сериализацию lat и lng независимо, что крайне неудовлетворительно, так как я закончил загрузкой специального кода сериализации.Я немного исправил это, используя отражение, но на самом деле все это большой беспорядок.

В чем здесь дело?Есть ли правильный путь, который я не изучил?

А если нет, то о чем думали авторы класса GeoCoordinate?Аннотация с атрибутом DataMember - это все, что нужно.Никогда не приходило в голову, что местоположения могут быть частью состояния приложения в приложении WP7?

Я уже видел этот фрагмент по сериализации и изолированным файлам хранения , а также это довольно интересная часть , которая ссылается на довольно простой вспомогательный помощник двоичной сериализации (класс Microsoft BinaryFormatter недоступен).

В Mango есть Silverlight4, или мне так сказали (у моего ноутбука нетдостаточно оперативной памяти, и та, кому нужно повиноваться, запретила мне строить большую систему до окончания нашей лыжной поездки в августе) - кто-нибудь знает, означает ли это, что BinaryFormatter будет доступен?Я мог бы воспроизвести BinaryFormatter, но не хотел бы.

Ответы [ 2 ]

0 голосов
/ 22 июня 2011

Хотя я придерживаюсь своего мнения, что Microsoft должна проявлять здравый смысл и гарантировать, что такие классы, как GeoCoordinate, являются сериализуемыми в DataContract, я нашел удобный обходной путь.Обычно, когда кто-то выполняет такую ​​работу, он импортирует интерфейс для веб-службы BingRoute или аналогичный.

Очевидно, что все классы в них являются сериализуемыми, поэтому я преобразовал весь свой код для использования типа BingRoute.Location вместо GeoCoordinate, и проблема исчезла.Где необходимо, метод расширения ToGeoCoordinate() делает преобразование достаточно незаметным, чтобы не было смысла для существующего кода.

public static GeoCoordinate ToGeoCoordinate(this BingRoute.Location loc)
{
  return new GeoCoordinate(loc.Latitude, loc.Longitude, loc.Altitude);
}

Если вы воспользуетесь моим советом, то рано или поздно вы пропустите метод GeDoCoordinate GetDistanceTo ().Методы расширения здесь тоже ваши друзья.

Вы можете преобразовать обе точки в GeoCoordinate и использовать встроенный метод, но это приведет к большому количеству временных объектов, и в какой-то момент ваше приложение захлебнется, пока сборщик мусора выполнит свою задачу.

Я добавил другой тип локации для хорошей меры.Обратите внимание, что код расстояния реализует Haversine, который является вычислением большого круга с рядом ограничений.Предостережение emptor.

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;
}

Также очень важно отметить, что чем больше вы сохраняете, тем медленнее запускается ваше приложение, потому что для создания объекта настроек при активации требуется больше времени.Поэтому лучше всего хранить здесь только простое состояние параметра и хранить как можно больше в изолированных файлах хранения.

0 голосов
/ 01 июня 2011

Если я не понимаю вас, не могли бы вы просто преобразовать значения вашей GeoCoordinate в пользовательский, сериализуемый объект? Регидратация - это просто десериализация вашего объекта и создание нового объекта GeoCoordinate.

Я не уверен, что BinaryFormatter доступен в наборе инструментов Mango, но набор инструментов Mango уже выпущен (бета), поэтому вы можете посмотреть .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...