序列化GoogleMapsLatLng并存储在cookie中

时间:2012-04-20 20:01:14

标签: javascript google-maps-api-3

我正在尝试将Google地图的中心点存储到Cookie中,并在下次加载页面时将地图恢复到最后位置。

当然我可以将经度和经度保存到cookie中作为字符串或序列化数组或其他东西,但我很好奇,如果我只是JSON将Google Maps LatLng对象序列化为cookie,然后稍后恢复它时间。

我正在使用JQuery和这个库:http://code.google.com/p/cookies/

我使用地图中的LatLng设置了Cookie:

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

然后我尝试读出它,期望序列化/反序列化将恢复我的对象......

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

但似乎没有保留对象类型。在脚本控制台中,这是LatLng对象在序列化并存储在cookie中之前的样子:

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。

2 个答案:

答案 0 :(得分:2)

只需序列化lat / lng。

序列化对象的原型或函数属性不能正常工作,因为它们必须为此进行字符串化,并且当您尝试将字符串转换回函数时,您将丢失对原始文件中可见的变量的所有引用范围但现在不可见。 您无法轻易猜到如何在以后手动恢复正确的原型,因为原型可以随时更改。 你将把你的对象绑定到LatLng原型的特定版本,当API更新时这将不会很有趣。

更不用说序列化那么多的数据会占用cookie中比普通lat / lng更多的空间。

答案 1 :(得分: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));