2012-04-20 72 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

相關問題