W mojej grze zapisuję bieżący stan, konwertując wszystkie obiekty do JSON, a następnie zapisując je w pliku. Niektóre obiekty, takie jak wrogowie, mają na nich funkcje, ale JSON nie może zapisywać funkcji! Czy istnieje alternatywa lub rozwiązanie?Dlaczego JSON nie może zapisać funkcji obiektu?
Odpowiedz
var Enemy = {
toJSON: function() {
// pack it up
},
fromJSON: function (json) {
// unpack it.
},
/* methods */
};
var e = Object.create(Enemy);
var json = JSON.stringify(e);
var same_e = Enemy.fromJSON(json);
sposób .toJSON
to standardowy interfejs JSON.stringify
będzie wyglądać ten sposób i wywołać, jeśli istnieje, to stringify zwrócony obiektu.
Metoda .fromJSON
jest tylko nazwanym konstruktorem dla obiektu Wroga.
przykład betonuJSfiddle
var Enemy = {
constructor: function(name, health) {
this.health = health || 100;
this.name = name;
},
shootThing: function (thing) { },
move: function (x,y) { },
hideBehindCover: function() {},
toJSON: function() {
return {
name: this.name,
health: this.health
};
},
fromJSON: function (json) {
var data = JSON.parse(json);
var e = Object.create(Enemy);
e.health = data.health;
e.name = data.name;
return e;
}
}
var e = Object.create(Enemy);
e.constructor("bob");
var json = JSON.stringify(e);
var e2 = Enemy.fromJSON(json);
console.log(e.name === e2.name);
Meta-opcja:
Opcja meta byłoby napisać nazwę klasy do obiektu
Game.Enemy = {
...
class: "Enemy"
};
Następnie podczas ładowania wszystkie twoje dane json właśnie robisz
var instance = Game[json.class].fromJSON(json);
W zasadzie muszę tworzyć nowe instancje wrogów za każdym razem, gdy zaczyna się gra? No cóż, trochę więcej pracy, ale bez znaczenia ... – corazza
@bane nowe instancje są tanie.Możesz to meta-ify, jeśli chcesz.Teraz – Raynos
@Raynos To nie zadziała, jeśli wrogowie są głęboko w drzewie obiektów, prawda? – thejh
myślę, że trzeba zapisać na typ obiektu tak, że funkcje mogą być ponownie dodawane w czasie przetwarzania. Na przykład. włóż właściwość type
na wroga w konstruktorze. W czasie analizowania najpierw przeanalizuj ciąg znaków jak normalny JSON, a następnie głęboko przemierzaj wynikowy obiekt. Kiedy napotkasz coś, co było Enemy
, ponownie załóż metody.
- 1. Dlaczego vtable nie może zawierać duplikatów funkcji?
- 2. Gson: Nie JSON obiektu
- 3. Dlaczego nie mogę zapisać funkcji boost :: w std :: list?
- 4. wymeditor nie może zapisać wstawionego elementu iframe
- 5. Grunt Concat nie może zapisać do pliku
- 6. Dlaczego destruktor nie jest wywoływany dla zwróconego obiektu z funkcji?
- 7. Deklaracja użycia nie może być powtarzana w zakresie funkcji. Dlaczego?
- 8. Dlaczego nie ma obiektu StrongReference?
- 9. Kopiowanie obiektu AJAX JSON do istniejącego obiektu
- 10. JavaScript - budowa obiektu JSON
- 11. Ile danych może zapisać przeglądarka w localStorage
- 12. Nie można wstawić obiektu do tablicy obiektu json
- 13. Podnośnik Framework nie może deserializować danych JSON
- 14. X509 nie może znaleźć żądanego obiektu
- 15. Android JSON obiektu
- 16. JSON zwraca [obiekt obiektu]
- 17. Dlaczego program python dict.update() nie zwraca obiektu?
- 18. Serializacja obiektu do JSON
- 19. Pełna ścieżka obiektu json
- 20. Mongoose: nie można zapisać zagnieżdżonego obiektu do zagnieżdżonego modelu
- 21. Dlaczego oszczędzać, dlaczego nie HTTP RPC (JSON + gzip)
- 22. Konwersja obiektu klasy stdClass do JSON Object
- 23. nie można wywołać funkcji członka bez obiektu
- 24. Błąd ODAP WebAPI Typ obiektu ObjectContent nie może serializować treści odpowiedzi dla typu zawartości "appliation/json ..."
- 25. Nie rozumiem błąd „nie znaleziono obiektu” wewnątrz funkcji
- 26. Jak zapisać wskaźnik funkcji w języku C#
- 27. Zapisać plik json do pliku w angularjs ..?
- 28. Jak zapisać obiekt JSON załadowany z pliku?
- 29. Czy funkcja d3.json() może uzyskać obiekt Json?
- 30. ASP.Net MVC3 - dlaczego domyślna obsługa wiązania modelu JSON nie może zdekodować typów wyliczeniowych?
Ponieważ json deserializuje _data_. – Raynos
Czy są specyficzne instancje funkcji lub "klasa"? – Thor84no
Co by się stało z zakresem funkcji, gdyby była serializowana i deserializowana? Funkcja to coś więcej niż jej kod jako reprezentacja ciągów znaków. – pimvdb