123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- goog.provide('goog.proto2.ObjectSerializer');
- goog.require('goog.asserts');
- goog.require('goog.proto2.FieldDescriptor');
- goog.require('goog.proto2.Serializer');
- goog.require('goog.string');
- goog.proto2.ObjectSerializer = function(
- opt_keyOption, opt_serializeBooleanAsNumber) {
- this.keyOption_ = opt_keyOption;
- this.serializeBooleanAsNumber_ = opt_serializeBooleanAsNumber;
- };
- goog.inherits(goog.proto2.ObjectSerializer, goog.proto2.Serializer);
- goog.proto2.ObjectSerializer.KeyOption = {
-
- TAG: 0,
-
- NAME: 1
- };
- goog.proto2.ObjectSerializer.prototype.serialize = function(message) {
- var descriptor = message.getDescriptor();
- var fields = descriptor.getFields();
- var objectValue = {};
-
- for (var i = 0; i < fields.length; i++) {
- var field = fields[i];
- var key = this.keyOption_ == goog.proto2.ObjectSerializer.KeyOption.NAME ?
- field.getName() :
- field.getTag();
- if (message.has(field)) {
- if (field.isRepeated()) {
- var array = [];
- objectValue[key] = array;
- for (var j = 0; j < message.countOf(field); j++) {
- array.push(this.getSerializedValue(field, message.get(field, j)));
- }
- } else {
- objectValue[key] = this.getSerializedValue(field, message.get(field));
- }
- }
- }
-
- message.forEachUnknown(function(tag, value) { objectValue[tag] = value; });
- return objectValue;
- };
- goog.proto2.ObjectSerializer.prototype.getSerializedValue = function(
- field, value) {
-
-
- if (this.serializeBooleanAsNumber_ &&
- field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.BOOL &&
- goog.isBoolean(value)) {
- return value ? 1 : 0;
- }
- return goog.proto2.ObjectSerializer.base(
- this, 'getSerializedValue', field, value);
- };
- goog.proto2.ObjectSerializer.prototype.getDeserializedValue = function(
- field, value) {
-
-
- if (field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.BOOL &&
- goog.isNumber(value)) {
- return Boolean(value);
- }
- return goog.proto2.ObjectSerializer.base(
- this, 'getDeserializedValue', field, value);
- };
- goog.proto2.ObjectSerializer.prototype.deserializeTo = function(message, data) {
- var descriptor = message.getDescriptor();
- for (var key in data) {
- var field;
- var value = data[key];
- var isNumeric = goog.string.isNumeric(key);
- if (isNumeric) {
- field = descriptor.findFieldByTag(key);
- } else {
-
- goog.asserts.assert(
- this.keyOption_ == goog.proto2.ObjectSerializer.KeyOption.NAME,
- 'Key mode ' + this.keyOption_ + 'for key ' + key + ' is not ' +
- goog.proto2.ObjectSerializer.KeyOption.NAME);
- field = descriptor.findFieldByName(key);
- }
- if (field) {
- if (field.isRepeated()) {
- goog.asserts.assert(
- goog.isArray(value),
- 'Value for repeated field ' + field + ' must be an array.');
- for (var j = 0; j < value.length; j++) {
- message.add(field, this.getDeserializedValue(field, value[j]));
- }
- } else {
- goog.asserts.assert(
- !goog.isArray(value),
- 'Value for non-repeated field ' + field + ' must not be an array.');
- message.set(field, this.getDeserializedValue(field, value));
- }
- } else {
- if (isNumeric) {
-
- message.setUnknown(Number(key), value);
- } else {
-
- goog.asserts.fail('Failed to find field: ' + key);
- }
- }
- }
- };
|