@@ -63,19 +63,34 @@ public class SimpleSerializable implements Cloneable {
6363if (fields == null) {
6464 fields = [];
6565}
66+ var filter = arguments[0];
67+ var ignoring = (filter == null || filter.ignoreDefaultFields ());
6668for (var i = 0; i < fields.length; i++) {
6769 var field = fields[i];
6870 var name = field.name;
69- buffer[buffer.length] = String.fromCharCode (baseChar + name.length) ;
70- buffer[buffer. length] = name;
71+ if (filter != null && !filter.accept ( name)) continue ;
72+ var nameStr = String.fromCharCode (baseChar + name. length) + name;
7173 var type = field.type;
7274 if (type == 'F' || type == 'D' || type == 'I' || type == 'L'
7375 || type == 'S' || type == 'B' || type == 'b') {
76+ if (ignoring && this[name] == 0
77+ && (type == 'F' || type == 'D' || type == 'I'
78+ || type == 'L' || type == 'S' || type == 'B')) {
79+ continue;
80+ }
81+ if (ignoring && this[name] == false && type == 'b') {
82+ continue;
83+ }
84+ buffer[buffer.length] = nameStr;
7485 buffer[buffer.length] = type;
7586 var value = "" + this[name];
7687 buffer[buffer.length] = String.fromCharCode (baseChar + value.length);
7788 buffer[buffer.length] = value;
7889 } else if (type == 'C') {
90+ if (ignoring && this[name] == 0 || this[name] == '\0') {
91+ continue;
92+ }
93+ buffer[buffer.length] = nameStr;
7994 buffer[buffer.length] = type;
8095 var value = "";
8196 if (typeof this[name] == 'number') {
@@ -86,12 +101,21 @@ public class SimpleSerializable implements Cloneable {
86101 buffer[buffer.length] = String.fromCharCode (baseChar + value.length);
87102 buffer[buffer.length] = value;
88103 } else if (type == 's') {
104+ if (ignoring && this[name] == null) {
105+ continue;
106+ }
107+ buffer[buffer.length] = nameStr;
89108 this.serializeString(buffer, this[name]);
90109 } else if (type.charAt (0) == 'A') {
91- buffer[buffer.length] = type;
92110 if (this[name] == null) {
111+ if (ignoring) {
112+ continue;
113+ }
114+ buffer[buffer.length] = nameStr;
93115 buffer[buffer.length] = String.fromCharCode (baseChar - 1);
94116 } else {
117+ buffer[buffer.length] = nameStr;
118+ buffer[buffer.length] = type;
95119 var l4 = this[name].length;
96120 if (l4 > 52) {
97121 if (l4 > 0x4000) { // 16 * 1024
@@ -180,6 +204,7 @@ public String serialize(SimpleFilter filter) {
180204 }
181205 clazz = clazz .getSuperclass ();
182206 }
207+ boolean ignoring = (filter == null || filter .ignoreDefaultFields ());
183208 try {
184209 Field [] fields = (Field []) fieldSet .toArray (new Field [0 ]);
185210 for (int i = 0 ; i < fields .length ; i ++) {
@@ -190,64 +215,83 @@ public String serialize(SimpleFilter filter) {
190215 && (modifiers & Modifier .STATIC ) == 0 ) {
191216 String name = field .getName ();
192217 if (filter != null && !filter .accept (name )) continue ;
193- buffer .append ((char )(baseChar + name .length ()));
194- buffer .append (name );
218+ String nameStr = (char )(baseChar + name .length ()) + name ;
195219 Class type = field .getType ();
196220 if (type == float .class ) {
197- buffer .append ('F' );
198221 float f = field .getFloat (this );
222+ if (f == 0.0 && ignoring ) continue ;
223+ buffer .append (nameStr );
224+ buffer .append ('F' );
199225 String value = "" + f ;
200226 buffer .append ((char ) (baseChar + value .length ()));
201227 buffer .append (f );
202228 } else if (type == double .class ) {
203- buffer .append ('D' );
204229 double d = field .getDouble (this );
230+ if (d == 0.0d && ignoring ) continue ;
231+ buffer .append (nameStr );
232+ buffer .append ('D' );
205233 String value = "" + d ;
206234 buffer .append ((char ) (baseChar + value .length ()));
207235 buffer .append (d );
208236 } else if (type == int .class ) {
209- buffer .append ('I' );
210237 int n = field .getInt (this );
238+ if (n == 0 && ignoring ) continue ;
239+ buffer .append (nameStr );
240+ buffer .append ('I' );
211241 String value = "" + n ;
212242 buffer .append ((char ) (baseChar + value .length ()));
213243 buffer .append (n );
214244 } else if (type == long .class ) {
215- buffer .append ('L' );
216245 long l = field .getLong (this );
246+ if (l == 0L && ignoring ) continue ;
247+ buffer .append (nameStr );
248+ buffer .append ('L' );
217249 String value = "" + l ;
218250 buffer .append ((char ) (baseChar + value .length ()));
219251 buffer .append (l );
220252 } else if (type == short .class ) {
221- buffer .append ('S' );
222253 short s = field .getShort (this );
254+ if (s == 0 && ignoring ) continue ;
255+ buffer .append (nameStr );
256+ buffer .append ('S' );
223257 String value = "" + s ;
224258 buffer .append ((char ) (baseChar + value .length ()));
225259 buffer .append (s );
226260 } else if (type == byte .class ) {
227- buffer .append ('B' );
228261 byte b = field .getByte (this );
262+ if (b == 0 && ignoring ) continue ;
263+ buffer .append (nameStr );
264+ buffer .append ('B' );
229265 String value = "" + b ;
230266 buffer .append ((char ) (baseChar + value .length ()));
231267 buffer .append (b );
232268 } else if (type == char .class ) {
233- buffer .append ('C' );
234269 int c = 0 + field .getChar (this );
270+ if (c == 0 && ignoring ) continue ;
271+ buffer .append (nameStr );
272+ buffer .append ('C' );
235273 String value = "" + c ;
236274 buffer .append ((char ) (baseChar + value .length ()));
237275 buffer .append (c );
238276 } else if (type == boolean .class ) {
239- buffer .append ('b' );
240277 boolean b = field .getBoolean (this );
278+ if (b == false && ignoring ) continue ;
279+ buffer .append (nameStr );
280+ buffer .append ('b' );
241281 String value = "" + b ;
242282 buffer .append ((char ) (baseChar + value .length ()));
243283 buffer .append (b );
244284 } else if (type == String .class ) {
245285 String s = (String ) field .get (this );
286+ if (s == null && ignoring ) continue ;
287+ buffer .append (nameStr );
246288 serializeString (buffer , s );
247289 } else { // Array ...
248290 if (type == float [].class ) {
249- buffer .append ("AF" );
250291 float [] fs = (float []) field .get (this );
292+ if (fs == null && ignoring ) continue ;
293+ buffer .append (nameStr );
294+ buffer .append ("AF" );
251295 if (fs == null ) {
252296 buffer .append ((char ) (baseChar - 1 ));
253297 } else {
@@ -260,8 +304,10 @@ public String serialize(SimpleFilter filter) {
260304 }
261305 }
262306 } else if (type == double [].class ) {
263- buffer .append ("AD" );
264307 double [] ds = (double []) field .get (this );
308+ if (ds == null && ignoring ) continue ;
309+ buffer .append (nameStr );
310+ buffer .append ("AD" );
265311 if (ds == null ) {
266312 buffer .append ((char ) (baseChar - 1 ));
267313 } else {
@@ -274,8 +320,10 @@ public String serialize(SimpleFilter filter) {
274320 }
275321 }
276322 } else if (type == int [].class ) {
277- buffer .append ("AI" );
278323 int [] ns = (int []) field .get (this );
324+ if (ns == null && ignoring ) continue ;
325+ buffer .append (nameStr );
326+ buffer .append ("AI" );
279327 if (ns == null ) {
280328 buffer .append ((char ) (baseChar - 1 ));
281329 } else {
@@ -288,8 +336,10 @@ public String serialize(SimpleFilter filter) {
288336 }
289337 }
290338 } else if (type == long [].class ) {
291- buffer .append ("AL" );
292339 long [] ls = (long []) field .get (this );
340+ if (ls == null && ignoring ) continue ;
341+ buffer .append (nameStr );
342+ buffer .append ("AL" );
293343 if (ls == null ) {
294344 buffer .append ((char ) (baseChar - 1 ));
295345 } else {
@@ -302,8 +352,10 @@ public String serialize(SimpleFilter filter) {
302352 }
303353 }
304354 } else if (type == short [].class ) {
305- buffer .append ("AS" );
306355 short [] ss = (short []) field .get (this );
356+ if (ss == null && ignoring ) continue ;
357+ buffer .append (nameStr );
358+ buffer .append ("AS" );
307359 if (ss == null ) {
308360 buffer .append ((char ) (baseChar - 1 ));
309361 } else {
@@ -316,8 +368,10 @@ public String serialize(SimpleFilter filter) {
316368 }
317369 }
318370 } else if (type == byte [].class ) {
319- buffer .append ("AB" );
320371 byte [] bs = (byte []) field .get (this );
372+ if (bs == null && ignoring ) continue ;
373+ buffer .append (nameStr );
374+ buffer .append ("AB" );
321375 if (bs == null ) {
322376 buffer .append ((char ) (baseChar - 1 ));
323377 } else {
@@ -330,8 +384,10 @@ public String serialize(SimpleFilter filter) {
330384 }
331385 }
332386 } else if (type == char [].class ) {
333- buffer .append ("AC" );
334387 char [] cs = (char []) field .get (this );
388+ if (cs == null && ignoring ) continue ;
389+ buffer .append (nameStr );
390+ buffer .append ("AC" );
335391 if (cs == null ) {
336392 buffer .append ((char ) (baseChar - 1 ));
337393 } else {
@@ -344,8 +400,10 @@ public String serialize(SimpleFilter filter) {
344400 }
345401 }
346402 } else if (type == boolean [].class ) {
347- buffer .append ("Ab" );
348403 boolean [] bs = (boolean []) field .get (this );
404+ if (bs == null && ignoring ) continue ;
405+ buffer .append (nameStr );
406+ buffer .append ("Ab" );
349407 if (bs == null ) {
350408 buffer .append ((char ) (baseChar - 1 ));
351409 } else {
@@ -358,8 +416,10 @@ public String serialize(SimpleFilter filter) {
358416 }
359417 }
360418 } else if (type == String [].class ) {
361- buffer .append ("AX" ); // special
362419 String [] ss = (String []) field .get (this );
420+ if (ss == null && ignoring ) continue ;
421+ buffer .append (nameStr );
422+ buffer .append ("AX" ); // special
363423 if (ss == null ) {
364424 buffer .append ((char ) (baseChar - 1 ));
365425 } else {
@@ -493,8 +553,10 @@ private void serializeString(StringBuffer buffer, String s) throws UnsupportedEn
493553 size = parseInt(sizeStr);
494554 } catch (e) { }
495555 }
556+ // all fields are in their default values or no fields
557+ if (size == 0) return true;
496558 index++;
497- if (size == 0 || size > length + start - index) return false;
559+ if (size > length + start - index) return false;
498560}
499561
500562var fieldMap = [];
@@ -654,12 +716,14 @@ public boolean deserialize(final String str, int start) {
654716 try {
655717 size = Integer .parseInt (sizeStr );
656718 } catch (NumberFormatException e ) {
657- //
719+ return false ;
658720 }
659721 }
722+ // all fields are in their default values or no fields
723+ if (size == 0 ) return true ;
660724 index ++;
661725 // may be empty string or not enough string!
662- if (size == 0 || size > length + start - index ) return false ;
726+ if (size > length + start - index ) return false ;
663727 }
664728
665729 Map fieldMap = new HashMap ();
0 commit comments