@@ -63,19 +63,34 @@ public class SimpleSerializable implements Cloneable {
6363if (fields == null) {
6464fields = [];
6565}
66+ var filter = arguments[0];
67+ var ignoring = (filter == null || filter.ignoreDefaultFields ());
6668for (var i = 0; i < fields.length; i++) {
6769var field = fields[i];
6870var 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;
7173var type = field.type;
7274if (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;
7485buffer[buffer.length] = type;
7586var value = "" + this[name];
7687buffer[buffer.length] = String.fromCharCode (baseChar + value.length);
7788buffer[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;
7994buffer[buffer.length] = type;
8095var value = "";
8196if (typeof this[name] == 'number') {
@@ -86,12 +101,21 @@ public class SimpleSerializable implements Cloneable {
86101buffer[buffer.length] = String.fromCharCode (baseChar + value.length);
87102buffer[buffer.length] = value;
88103} else if (type == 's') {
104+ if (ignoring && this[name] == null) {
105+ continue;
106+ }
107+ buffer[buffer.length] = nameStr;
89108this.serializeString(buffer, this[name]);
90109} else if (type.charAt (0) == 'A') {
91- buffer[buffer.length] = type;
92110if (this[name] == null) {
111+ if (ignoring) {
112+ continue;
113+ }
114+ buffer[buffer.length] = nameStr;
93115buffer[buffer.length] = String.fromCharCode (baseChar - 1);
94116} else {
117+ buffer[buffer.length] = nameStr;
118+ buffer[buffer.length] = type;
95119var l4 = this[name].length;
96120if (l4 > 52) {
97121if (l4 > 0x4000) { // 16 * 1024
@@ -180,6 +204,7 @@ public String serialize(SimpleFilter filter) {
180204}
181205clazz =clazz .getSuperclass ();
182206}
207+ boolean ignoring = (filter ==null ||filter .ignoreDefaultFields ());
183208try {
184209Field []fields = (Field [])fieldSet .toArray (new Field [0 ]);
185210for (int i =0 ;i <fields .length ;i ++) {
@@ -190,64 +215,83 @@ public String serialize(SimpleFilter filter) {
190215&& (modifiers &Modifier .STATIC ) ==0 ) {
191216String name =field .getName ();
192217if (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 ;
195219Class type =field .getType ();
196220if (type ==float .class ) {
197- buffer .append ('F' );
198221float f =field .getFloat (this );
222+ if (f ==0.0 &&ignoring )continue ;
223+ buffer .append (nameStr );
224+ buffer .append ('F' );
199225String value ="" +f ;
200226buffer .append ((char ) (baseChar +value .length ()));
201227buffer .append (f );
202228}else if (type ==double .class ) {
203- buffer .append ('D' );
204229double d =field .getDouble (this );
230+ if (d ==0.0d &&ignoring )continue ;
231+ buffer .append (nameStr );
232+ buffer .append ('D' );
205233String value ="" +d ;
206234buffer .append ((char ) (baseChar +value .length ()));
207235buffer .append (d );
208236}else if (type ==int .class ) {
209- buffer .append ('I' );
210237int n =field .getInt (this );
238+ if (n ==0 &&ignoring )continue ;
239+ buffer .append (nameStr );
240+ buffer .append ('I' );
211241String value ="" +n ;
212242buffer .append ((char ) (baseChar +value .length ()));
213243buffer .append (n );
214244}else if (type ==long .class ) {
215- buffer .append ('L' );
216245long l =field .getLong (this );
246+ if (l ==0L &&ignoring )continue ;
247+ buffer .append (nameStr );
248+ buffer .append ('L' );
217249String value ="" +l ;
218250buffer .append ((char ) (baseChar +value .length ()));
219251buffer .append (l );
220252}else if (type ==short .class ) {
221- buffer .append ('S' );
222253short s =field .getShort (this );
254+ if (s ==0 &&ignoring )continue ;
255+ buffer .append (nameStr );
256+ buffer .append ('S' );
223257String value ="" +s ;
224258buffer .append ((char ) (baseChar +value .length ()));
225259buffer .append (s );
226260}else if (type ==byte .class ) {
227- buffer .append ('B' );
228261byte b =field .getByte (this );
262+ if (b ==0 &&ignoring )continue ;
263+ buffer .append (nameStr );
264+ buffer .append ('B' );
229265String value ="" +b ;
230266buffer .append ((char ) (baseChar +value .length ()));
231267buffer .append (b );
232268}else if (type ==char .class ) {
233- buffer .append ('C' );
234269int c =0 +field .getChar (this );
270+ if (c ==0 &&ignoring )continue ;
271+ buffer .append (nameStr );
272+ buffer .append ('C' );
235273String value ="" +c ;
236274buffer .append ((char ) (baseChar +value .length ()));
237275buffer .append (c );
238276}else if (type ==boolean .class ) {
239- buffer .append ('b' );
240277boolean b =field .getBoolean (this );
278+ if (b ==false &&ignoring )continue ;
279+ buffer .append (nameStr );
280+ buffer .append ('b' );
241281String value ="" +b ;
242282buffer .append ((char ) (baseChar +value .length ()));
243283buffer .append (b );
244284}else if (type ==String .class ) {
245285String s = (String )field .get (this );
286+ if (s ==null &&ignoring )continue ;
287+ buffer .append (nameStr );
246288serializeString (buffer ,s );
247289}else {// Array ...
248290if (type ==float [].class ) {
249- buffer .append ("AF" );
250291float []fs = (float [])field .get (this );
292+ if (fs ==null &&ignoring )continue ;
293+ buffer .append (nameStr );
294+ buffer .append ("AF" );
251295if (fs ==null ) {
252296buffer .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" );
264307double []ds = (double [])field .get (this );
308+ if (ds ==null &&ignoring )continue ;
309+ buffer .append (nameStr );
310+ buffer .append ("AD" );
265311if (ds ==null ) {
266312buffer .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" );
278323int []ns = (int [])field .get (this );
324+ if (ns ==null &&ignoring )continue ;
325+ buffer .append (nameStr );
326+ buffer .append ("AI" );
279327if (ns ==null ) {
280328buffer .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" );
292339long []ls = (long [])field .get (this );
340+ if (ls ==null &&ignoring )continue ;
341+ buffer .append (nameStr );
342+ buffer .append ("AL" );
293343if (ls ==null ) {
294344buffer .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" );
306355short []ss = (short [])field .get (this );
356+ if (ss ==null &&ignoring )continue ;
357+ buffer .append (nameStr );
358+ buffer .append ("AS" );
307359if (ss ==null ) {
308360buffer .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" );
320371byte []bs = (byte [])field .get (this );
372+ if (bs ==null &&ignoring )continue ;
373+ buffer .append (nameStr );
374+ buffer .append ("AB" );
321375if (bs ==null ) {
322376buffer .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" );
334387char []cs = (char [])field .get (this );
388+ if (cs ==null &&ignoring )continue ;
389+ buffer .append (nameStr );
390+ buffer .append ("AC" );
335391if (cs ==null ) {
336392buffer .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" );
348403boolean []bs = (boolean [])field .get (this );
404+ if (bs ==null &&ignoring )continue ;
405+ buffer .append (nameStr );
406+ buffer .append ("Ab" );
349407if (bs ==null ) {
350408buffer .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
362419String []ss = (String [])field .get (this );
420+ if (ss ==null &&ignoring )continue ;
421+ buffer .append (nameStr );
422+ buffer .append ("AX" );// special
363423if (ss ==null ) {
364424buffer .append ((char ) (baseChar -1 ));
365425}else {
@@ -493,8 +553,10 @@ private void serializeString(StringBuffer buffer, String s) throws UnsupportedEn
493553size = parseInt(sizeStr);
494554} catch (e) { }
495555}
556+ // all fields are in their default values or no fields
557+ if (size == 0) return true;
496558index++;
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) {
654716try {
655717size =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 ;
660724index ++;
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
665729Map fieldMap =new HashMap ();