2013-03-04 16 views
17

Czy istnieje struktura serializacji dla Javascript, która zachowałaby informacje o klasie i informacje referencyjne, takie jak pikle Pythona? To znaczy. można bezpośrednio zająć prototypial instancji dziedziczone klasy (nie tylko JSON-podobnych danych) oraz serializacji to podoba ::Peptonowanie trawienia pełnych obiektów Javascript

// Somehow add serialization metadata to classes first 
obj = new MyObject(); 
obj.referred = new MyObject2(); 
pickle = serializer.dump(obj) // Provides byte stream of the serialized object 

serializer mógłby zająć informacji klasy

  • Kodowanie w zalewie - powinno to być w jakiś sposób dostosować ze względu na różne systemy klasy JS w istnieniu

  • automatycznie podążają i szeregować określone obiekty

  • Zapewnić haki dodać niestandardowe Encoders/dla wartości (dat będących najczęstszą przypadek)

Byłoby to czyni wewnętrznego przechowywania i przenoszenia złożonych struktur danych trochę łatwiejsze. Mam nadzieję, że wykorzystam to w silniku gry. Podobnie jak w przypadku pikli, deserializacja danych nie byłaby możliwa bez orignal kodu JavaScript dostarczającego definicje klas.

Jakie rodzaje ram istnieją dla JavaScript już istnieją lub czy będę musiał wdrożyć niestandardowy system?

+0

Co wykorzystałeś w końcu? Szukam podobnego rozwiązania ... –

+0

occamsrazor.js (patrz pierwsza odpowiedź) jest najlepszym IMHO, choć tylko półautomatyczne –

Odpowiedz

4

To nie pasuje idealnie, ale można spróbować użyć occamsrazor.js. ten sposób można używać JSON serializacji:

// this is your costructor function 
function Circle(attrs){ 
    this.radius = attrs.radius; 
} 
Circle.prototype.area = function(){ 
    return this.radius*this.radius*Math.PI; 
} 
Circle.prototype.perimeter = function(){ 
    return 2*this.radius*Math.PI; 
} 

// this is a validator 
function hasRadius(obj){ 
    return radius in obj; 
} 

// this is your factory function 
objFactory = occamsrazor().addContructor(hasRadius, Circle); 

// this is your deserialized object 
var json = '{"radius": 10}'; 

// circle now is a full fledged object 
var circle = objFactory(JSON.parse(json)); 

Wadą jest to, że nie dostaniesz migawkę obiektu jak za pomocą marynatę, odtworzyć nowy obiekt. Ale może to być wygodne w niektórych okolicznościach.

+0

Dzięki. Jeśli trzeba wdrożyć taki system, najlepiej zbudować na szczycie occamrazor.js :) –

1

Zapoznaj się z msgpack. Chociaż nie użyłem go do obiektów JavaScript, przykład wydaje się sugerować, że będzie działać dla obiektów, a nie tylko JSON-ów. Dodatkowa zaleta: jest to jedna z najszybszych implementacji, jakie kiedykolwiek stosowałem do serializacji.

+0

Sprawdziłem msgpack i nie znalazłem przykładów dla pełnych obiektów Javascript :( –

2

Możecie zajrzeć do hunterloftis/cryo. Z pliku Readme:

Zbudowany dla node.js i przeglądarek. Cryo jest zainspirowane piklem Pythona i działa podobnie do JSON.stringify() i JSON.parse(). Cryo.stringify() i Cryo.analizować() poprawić JSON w tych okolicznościach:

  • Undefined
  • Data
  • Nieskończoność
  • referencje obiektu
  • Dołączone właściwości
  • Funkcje
  • DOM Węzły

Istnieje krótka dyskusja z autorem pod numerem r/programming.

Źródło jest proste, bez magii.

Jeszcze tego nie próbowałem.

1

Oto kilka z nich:

Jason: Pełne ujawnienie: zrobiłem tego. Ale używam go i jest to moje najlepsze zalecenie do pełnej serializacji javascript. Prawdopodobnie będziesz odczuwał o wiele mniej bólu przy użyciu tego niż którykolwiek z pozostałych i byłbym zachwycony, gdyby dodawał do biblioteki dodatki, jeśli nie spełnia Twoich oczekiwań! Informacje o prototypie/konstruktorze, wielokrotne odniesienia do tego samego obiektu, mają zaczepy dla typów zdefiniowanych przez użytkownika. Zapisuje kopię prototypu, chyba że wyraźnie dodasz prototyp do listy "stałych", w którym to przypadku używa on już istniejącego prototypu podczas przebudowy. Zawiera zamiennik w stylu JSON i sposoby odwoływania się do obiektów, które będą istnieć w czasie parsowania. Serializes Date, RegExp, null, NaN, Infinity, -Infinity, function, DOM Element, Event i normalnymi obiektami. Nadal nie jest to wypróbowana i przetestowana biblioteka, ale jeśli to nie działa, możesz wysłać mi wiadomość e-mail, a ja spróbuję to naprawić. https://github.com/johnlarson/Jason

ResurrectJS: Informacje o prototypie/konstruktorze, wielokrotne odniesienia do tego samego obiektu, brak haczyków. Używa właściwości 'constructor', aby uzyskać konstruktor, i istnieją pewne ograniczenia z przestrzeniami nazw konstruktorów, które można ominąć za pomocą niestandardowego resolvera nazw. Ma zamiennik w stylu JSON. Serializuje Data, RegExp, Elementy DOM, NaN, Nieskończoność, -Infinity i normalne obiekty. Bardziej dojrzały i bardziej przetestowany pod względem użytkowania niż Jason, ale trudniejszy w użyciu. https://github.com/skeeto/resurrect-js

SnapShot: Nie próbowałem tego. Wygląda obiecująco, ale ostatnio był aktualizowany 3 lata temu. Brak informacji o automatycznym prototypie/konstruktorze, o ile mogę to stwierdzić, ale ma api api do definiowania niestandardowego zachowania serializacji/deserializacji, podobnie jak JSON toJSON i fromJSON. Obsługuje wiele odwołań do tego samego obiektu. Nie mogę powiedzieć, że jestem zamiennikiem w stylu JSON. Serializes Date, RegExp, null i function. https://github.com/mixu/snapshot

JASON: Kolejna obiecująca biblioteka, której nie próbowałem, została ostatnio zaktualizowana 3 lata temu. Nie wiem, czy robi to prototyp/konstruktor. Obsługuje wiele odwołań do tego samego obiektu. O ile mi wiadomo, nie ma haków. Nie wiem, czy ma zamiennik w stylu JSON. Serializuje "Daty, Regexy, Booleany itp." oraz "wszystkie prymitywy JS, w tym niezdefiniowane". https://github.com/xk/JASON

Powiązane problemy