Best way to serialize/unserialize objects in JavaScript?

前端 未结 8 1412
忘掉有多难
忘掉有多难 2020-11-27 13:53

I have many JavaScript objects in my application, something like:

function Person(age) {
    this.age = age;
    this.isOld = function (){
        return thi         


        
8条回答
  •  执念已碎
    2020-11-27 14:03

    I had a similar problem and since I couldn't find a sufficient solution, I also created a serialization library for javascript: https://github.com/wavesoft/jbb (as a matter of fact it's a bit more, since it's mainly intended for bundling resources)

    It is close to Binary-JSON but it adds a couple of additional features, such as metadata for the objects being encoded and some extra optimizations like data de-duplication, cross-referencing to other bundles and structure-level compression.

    However there is a catch: In order to keep the bundle size small there are no type information in the bundle. Such information are provided in a separate "profile" that describes your objects for encoding and decoding. For optimization reasons this information is given in a form of script.

    But you can make your life easier using the gulp-jbb-profile (https://github.com/wavesoft/gulp-jbb-profile) utility for generating the encodeing/decoding scripts from simple YAML object specifications like this:

    # The 'Person' object has the 'age' and 'isOld'
    # properties
    Person:
      properties:
        - age
        - isOld
    

    For example you can have a look on the jbb-profile-three profile. When you have your profile ready, you can use JBB like this:

    var JBBEncoder = require('jbb/encode');
    var MyEncodeProfile = require('profile/profile-encode');
    
    // Create a new bundle
    var bundle = new JBBEncoder( 'path/to/bundle.jbb' );
    
    // Add one or more profile(s) in order for JBB
    // to understand your custom objects
    bundle.addProfile(MyEncodeProfile);
    
    // Encode your object(s) - They can be any valid
    // javascript object, or objects described in
    // the profiles you added previously.
    
    var p1 = new Person(77);
    bundle.encode( p1, 'person' );
    
    var people = [
            new Person(45),
            new Person(77),
            ...
        ];
    bundle.encode( people, 'people' );
    
    // Close the bundle when you are done
    bundle.close();
    

    And you can read it back like this:

    var JBBDecoder = require('jbb/decode');
    var MyDecodeProfile = require('profile/profile-decode');
    
    // Instantiate a new binary decoder
    var binaryLoader = new JBBDecoder( 'path/to/bundle' );
    
    // Add your decoding profile
    binaryLoader.addProfile( MyDecodeProfile );
    
    // Add one or more bundles to load
    binaryLoader.add( 'bundle.jbb' );
    
    // Load and callback when ready
    binaryLoader.load(function( error, database ) {
    
        // Your objects are in the database
        // and ready to use!
        var people = database['people'];
    
    });
    

提交回复
热议问题