2012-04-20 5 views
0

Я пытаюсь сохранить центр центра карты Google в файл cookie и восстановить карту до последней позиции при следующей загрузке страницы.Сериализация GoogleMapsLatLng и сохранение в файле cookie

Я уверен, что могу сохранить широту и долготу в файле cookie как строку или сериализованный массив или что-то в этом роде, но мне любопытно, могу ли я только JSON сериализовать объект LatLng Google Maps в файл cookie, а затем просто восстановить его на позднее время.

Я использую JQuery и эту библиотеку: http://code.google.com/p/cookies/

Я установил печенье с LatLng с карты:

$.cookies.set('map_center', map.getCenter()); 

И тогда я стараюсь читать его ожидает сериализации/десериализации будет восстановить мой объект ...

var centerpointFromCookie = $.cookies.get('map_center); 
map.setCenter(centerpointFromCookie); 

Но, похоже, тип объекта не сохраняется. В консоли сценария это то, что LatLng объект выглядит, прежде чем он сериализации и хранятся в куки:

map.getCenter() 
O 
$a: 151.21950000000004 
Za: -33.8688 
__proto__: O 
constructor: function O(a, b, c) {a-=0;b-=0;c||(a=Bd(a,-90,90),b=Cd(b,-180,180));this.Za=a;this.$a=b;} 
equals: function (a) {return!a?k:Dd(this.lat(),a.lat())&&Dd(this.lng(),a.lng());} 
lat: function() {return this[a];} 
lng: function() {return this[a];} 
toString: function() {return"("+this.lat()+", "+this.lng()+")";} 
toUrlValue: function (a) {a=Hd(a)?a:6;return ae(this.lat(),a)+","+ae(this.lng(),a);} 
__proto__: Object 

И это то, что он выглядит как впоследствии:

centerpointFromCookie 
Object 
$a: 151.21950000000004 
Za: -33.8688 
__proto__: Object 
__defineGetter__: function __defineGetter__() { 
__defineSetter__: function __defineSetter__() { 
__lookupGetter__: function __lookupGetter__() { 
__lookupSetter__: function __lookupSetter__() { 
constructor: function Object() { 
hasOwnProperty: function hasOwnProperty() { 
isPrototypeOf: function isPrototypeOf() { 
propertyIsEnumerable: function propertyIsEnumerable() { 
toLocaleString: function toLocaleString() { 
toString: function toString() { 
valueOf: function valueOf() { 

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

+0

Даже если это возможно, вы будете полагаться на детали реализации. Вы не должны. Это может означать, что ваше приложение может просто сломаться в будущем. Я бы (и на самом деле имел в прошлом то же самое), просто придерживаюсь сохранения широты и долготы в файле cookie. Конечно, если это просто любопытство, управляющее вашим вопросом, нет ничего против этого. – Jasper

ответ

2

Просто сериализуйте lat/lng.

Сериализация свойств прототипа объекта или функции не работает должным образом, потому что для этого необходимо выполнить строковое кодирование, и когда вы попытаетесь превратить строку в функцию, вы потеряете все ссылки на переменные, которые были видны в но не видны сейчас. И вы не можете угадать, как вручную восстановить правильный прототип позже, потому что прототипы могут измениться в любое время. И вы свяжете свой объект с конкретной версией прототипа LatLng, который не будет забавным при обновлении API.

Не говоря уже о сериализации того, что многие данные занимают гораздо больше места в файле cookie, чем простой lat/lng.

1

getCenter() уже дает вам только значения. Таким образом, вы можете превратить это в строку JSON и проанализировать его, когда хотите снова использовать его;

var center = JSON.stringify(map.getCenter()); 
$.cookies.set('map_center', center); 

И когда вы хотите прочитать из файла cookie;

var centerpointFromCookie = $.cookies.get('map_center); 
map.setCenter(JSON.parse(centerpointFromCookie)); 
+0

Я просто собираюсь использовать классы LatLng toString и забыть о сериализации, но это имеет смысл как подход в других обстоятельствах. – Nick

Смежные вопросы