2012-04-20 73 views
0

我试图将Google Map的中心点存储到cookie中,并在下次加载页面时将地图恢复到最后位置。序列化GoogleMapsLatLng并存储在cookie中

当然,我可以将经度和纬度保存为一个字符串或序列化数组或其他东西,但我很好奇,如果我只能将JSON序列化到谷歌地图LatLng对象的cookie,然后只是在一个晚点。

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

我从地图上设置Cookie用经纬度:

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

,然后我试着读出来期待的序列化/反序列化会恢复我的对象...

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

但它似乎没有保留对象类型。在脚本控制台,这是经纬度对象是什么样子之前,它是序列化,并存储在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。

+0

即使这是可能的,您将依靠实施细节。你不应该。这可能意味着您的应用程序可能会在未来中断。 我会(并且实际上在过去具有完全相同的东西)只需坚持将经度和纬度存储在cookie中。当然,如果仅仅是因为好奇心而推动你的问题,那没有什么可以反对的。 – Jasper 2012-04-20 20:17:57

回答

2

只需要序列化lat/lng。

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

更不用说序列化的数据会比普通的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 2012-04-20 20:54:21

相关问题