WaBis

walter.bislins.ch

JavaScripts: SerializerParser

JavaScript zum Serialisieren und Parsen von Integer, Strings und StringListen.

Anwendung

Wenn man mehrere Eingabefelder und Variablen einer Website in einem Cookie speichern will, kann man alle Werte der Felder mit dem Serializer in einen String packen und diesen in einem Cookie speichern. Beim Laden der Seite kann das Cookie ausgelesen werden und der String mit dem Parser wieder n die ursprünglichen Werte zerlegt werden.

Die Werte müssen in genau derselben Reihenfolge geparst werden, wie sie serialisiert wurden! Der Code ist jedoch robust, sodass bei Fehlern beim Parsen sinnvolle Standardwerte generiert werden:

  • Integer = 0
  • String = ''
  • StringList = []

Beispiel

var Stack = [];
var SP = 0;
var Flags = 0;

function SaveToCookie(name) {
  Streamer.Reset();
  Streamer.PushStrList( Stack );
  Streamer.PushInt( SP );
  Streamer.PushInt( Flags );
  xSetCookie( name, Streamer.Str, 1 );
}

function LoadFromCookie(name) {
  Streamer.Reset( xGetCookie(name) );
  Stack = Streamer.GetStrList();
  SP = Streamer.GetInt();
  Flags = Streamer.GetInt();
}

Code

function SerializerParser() {
  this.Str = '';
  this.Pos = 0;
}

SerializerParser.prototype.Reset = function( s ) {
  this.Str = xStr(s) ? s : '';
  this.Pos = 0;
}

SerializerParser.prototype.PushInt = function( i ) {
  this.Str += i + '|';
  return this.Str;
}

SerializerParser.prototype.PushStr = function( s ) {
  this.PushInt( s.length );
  this.Str += s + '|';
  return this.Str;
}

SerializerParser.prototype.PushStrList = function( sl ) {
  this.PushInt( sl.length );
  for (var i = 0; i < sl.length; i++) {
    this.PushStr( sl[i] );
  }
  return this.Str;
}

SerializerParser.prototype.GetInt = function() {
  if (this.Pos >= this.Str.length) return 0;
  var p = this.Str.indexOf( '|', this.Pos );
  if (p < 0) return 0;
  var s = this.Str.slice( this.Pos, p );
  this.Pos = p + 1;
  if (s == '') return 0;
  var i = parseInt( s );
  if (isNaN(i)) return 0;
  return parseInt( s );
}

SerializerParser.prototype.GetStr = function() {
  if (this.Pos >= this.Str.length) return '';
  var l = this.GetInt();
  if (l < 0) return '';
  var last = this.Pos + l;
  if (last > this.Str.length) return '';
  var s = this.Str.slice( this.Pos, last );
  this.Pos = last + 1;
  return s;
}

SerializerParser.prototype.GetStrList = function() {
  var list = [];
  if (this.Pos >= this.Str.length) return list;
  var size = this.GetInt();
  if (size < 0) return list;
  for (var i = 0; i < size; i++) {
    list.push( this.GetStr() );
  }
  return list;
}

var Streamer = new SerializerParser();

Weitere Infos zur Seite
Erzeugt Freitag, 9. Januar 2015
von wabis
Zum Seitenanfang
Geändert Samstag, 18. Juli 2015
von wabis