• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wuwen5 / hessian / 17882005206

20 Sep 2025 01:06PM UTC coverage: 70.892% (+1.5%) from 69.377%
17882005206

push

github

web-flow
refactor: code clean (#50)

* refactor: code clean

* refactor: code clean,remove hessian1 code

* refactor: fix HessianDebugState

1780 of 2691 branches covered (66.15%)

Branch coverage included in aggregate %.

4226 of 5781 relevant lines covered (73.1%)

3.17 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

81.41
hessian2-codec/src/main/java/io/github/wuwen5/hessian/io/Hessian2SerializerFactory.java
1
/*
2
 * Copyright (c) 2001-2008 Caucho Technology, Inc.  All rights reserved.
3
 *
4
 * The Apache Software License, Version 1.1
5
 *
6
 * Redistribution and use in source and binary forms, with or without
7
 * modification, are permitted provided that the following conditions
8
 * are met:
9
 *
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 *
13
 * 2. Redistributions in binary form must reproduce the above copyright
14
 *    notice, this list of conditions and the following disclaimer in
15
 *    the documentation and/or other materials provided with the
16
 *    distribution.
17
 *
18
 * 3. The end-user documentation included with the redistribution, if
19
 *    any, must include the following acknowlegement:
20
 *       "This product includes software developed by the
21
 *        Caucho Technology (http://www.caucho.com/)."
22
 *    Alternately, this acknowlegement may appear in the software itself,
23
 *    if and wherever such third-party acknowlegements normally appear.
24
 *
25
 * 4. The names "Burlap", "Resin", and "Caucho" must not be used to
26
 *    endorse or promote products derived from this software without prior
27
 *    written permission. For written permission, please contact
28
 *    info@caucho.com.
29
 *
30
 * 5. Products derived from this software may not be called "Resin"
31
 *    nor may "Resin" appear in their names without prior written
32
 *    permission of Caucho Technology.
33
 *
34
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
35
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
36
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
37
 * DISCLAIMED.  IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
38
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
39
 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
40
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
41
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
42
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
43
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
44
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45
 *
46
 * @author Scott Ferguson
47
 */
48

49
package io.github.wuwen5.hessian.io;
50

51
import com.caucho.hessian.io.HessianRemoteObject;
52
import java.io.IOException;
53
import java.io.InputStream;
54
import java.io.Serializable;
55
import java.lang.annotation.Annotation;
56
import java.lang.ref.SoftReference;
57
import java.lang.ref.WeakReference;
58
import java.net.InetAddress;
59
import java.util.ArrayList;
60
import java.util.Calendar;
61
import java.util.Collection;
62
import java.util.Enumeration;
63
import java.util.HashMap;
64
import java.util.Iterator;
65
import java.util.List;
66
import java.util.Map;
67
import java.util.WeakHashMap;
68
import java.util.concurrent.ConcurrentHashMap;
69
import java.util.concurrent.ConcurrentMap;
70
import java.util.logging.Level;
71
import java.util.logging.Logger;
72
import lombok.Getter;
73
import lombok.Setter;
74
import lombok.SneakyThrows;
75

76
/**
77
 * Factory for returning serialization methods.
78
 */
79
public class Hessian2SerializerFactory implements ISerializerFactory {
80
    private static final Logger log = Logger.getLogger(Hessian2SerializerFactory.class.getName());
4✔
81

82
    private static final ClassLoader SYSTEM_CLASS_LOADER;
83

84
    private static final Map<String, HessianDeserializer> STATIC_TYPE_MAP;
85

86
    private static final WeakHashMap<ClassLoader, SoftReference<Hessian2SerializerFactory>> DEFAULT_FACTORY_REF_MAP =
4✔
87
            new WeakHashMap<>();
88

89
    private final ContextSerializerFactory contextFactory;
90
    private final WeakReference<ClassLoader> loaderRef;
91

92
    protected HessianSerializer defaultSerializer;
93

94
    /**
95
     * Additional factories
96
     */
97
    protected List<ISerializerFactory> factories = new ArrayList<>();
5✔
98

99
    protected CollectionSerializer collectionSerializer;
100
    protected MapSerializer mapSerializer;
101

102
    private HessianDeserializer hashMapDeserializer;
103
    private HessianDeserializer arrayListDeserializer;
104
    private final ConcurrentMap<Class<?>, HessianSerializer> cachedSerializerMap = new ConcurrentHashMap<>(8);
6✔
105
    private final ConcurrentMap<Class<?>, HessianDeserializer> cachedDeserializerMap = new ConcurrentHashMap<>(8);
6✔
106
    private final ConcurrentMap<String, HessianDeserializer> cachedTypeDeserializerMap = new ConcurrentHashMap<>();
5✔
107

108
    /**
109
     * -- SETTER --
110
     *  If true, non-serializable objects are allowed.
111
     * -- GETTER --
112
     *  If true, non-serializable objects are allowed.
113
     *
114
     */
115
    @Getter
116
    @Setter
117
    private boolean isAllowNonSerializable;
118

119
    private final boolean isEnableUnsafeSerializer = (UnsafeSerializer.isEnabled() && UnsafeDeserializer.isEnabled());
9!
120

121
    private final FieldDeserializer2Factory fieldDeserializer2Factory;
122

123
    private ClassFactory classFactory;
124

125
    public Hessian2SerializerFactory() {
126
        this(Thread.currentThread().getContextClassLoader());
4✔
127
    }
1✔
128

129
    public Hessian2SerializerFactory(ClassLoader loader) {
2✔
130
        loaderRef = new WeakReference<>(loader);
6✔
131

132
        contextFactory = ContextSerializerFactory.create(loader);
4✔
133

134
        if (isEnableUnsafeSerializer) {
3✔
135
            fieldDeserializer2Factory = new FieldDeserializer2FactoryUnsafe();
6✔
136
        } else {
137
            fieldDeserializer2Factory = new FieldDeserializer2Factory();
5✔
138
        }
139
    }
1✔
140

141
    public static Hessian2SerializerFactory createDefault() {
142
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
3✔
143

144
        synchronized (DEFAULT_FACTORY_REF_MAP) {
4✔
145
            SoftReference<Hessian2SerializerFactory> factoryRef = DEFAULT_FACTORY_REF_MAP.get(loader);
5✔
146

147
            Hessian2SerializerFactory factory = null;
2✔
148

149
            if (factoryRef != null) {
2✔
150
                factory = factoryRef.get();
4✔
151
            }
152

153
            if (factory == null) {
2✔
154
                factory = new Hessian2SerializerFactory();
4✔
155

156
                factoryRef = new SoftReference<>(factory);
5✔
157

158
                DEFAULT_FACTORY_REF_MAP.put(loader, factoryRef);
5✔
159
            }
160

161
            return factory;
4✔
162
        }
163
    }
164

165
    public ClassLoader getClassLoader() {
166
        return loaderRef.get();
5✔
167
    }
168

169
    /**
170
     * Set true if the collection serializer should send the java type.
171
     */
172
    public void setSendCollectionType(boolean isSendType) {
173
        if (collectionSerializer == null) {
×
174
            collectionSerializer = new CollectionSerializer();
×
175
        }
176

177
        collectionSerializer.setSendJavaType(isSendType);
×
178

179
        if (mapSerializer == null) {
×
180
            mapSerializer = new MapSerializer();
×
181
        }
182

183
        mapSerializer.setSendJavaType(isSendType);
×
184
    }
×
185

186
    /**
187
     * Adds a factory.
188
     */
189
    public void addFactory(ISerializerFactory factory) {
190
        factories.add(factory);
×
191
    }
×
192

193
    /**
194
     * Returns the serializer for a class.
195
     *
196
     * @param cl the class of the object that needs to be serialized.
197
     *
198
     * @return a serializer object for the serialization.
199
     */
200
    public HessianSerializer getObjectSerializer(Class<?> cl) throws HessianProtocolException {
201
        HessianSerializer serializer = getSerializer(cl);
4✔
202

203
        if (serializer instanceof ObjectSerializer) {
3✔
204
            return ((ObjectSerializer) serializer).getObjectSerializer();
4✔
205
        } else {
206
            return serializer;
2✔
207
        }
208
    }
209

210
    public Class<?> loadSerializedClass(String className) throws ClassNotFoundException {
211
        return getClassFactory().load(className);
5✔
212
    }
213

214
    public ClassFactory getClassFactory() {
215
        synchronized (this) {
4✔
216
            if (classFactory == null) {
3✔
217
                classFactory = new ClassFactory(getClassLoader());
7✔
218
            }
219

220
            return classFactory;
5✔
221
        }
222
    }
223

224
    public FieldDeserializer2Factory getFieldDeserializerFactory() {
225
        return fieldDeserializer2Factory;
×
226
    }
227

228
    /**
229
     * Returns the serializer for a class.
230
     *
231
     * @param cl the class of the object that needs to be serialized.
232
     *
233
     * @return a serializer object for the serialization.
234
     */
235
    @Override
236
    public HessianSerializer getSerializer(Class<?> cl) throws HessianProtocolException {
237
        HessianSerializer serializer = cachedSerializerMap.get(cl);
6✔
238

239
        if (serializer != null) {
2✔
240
            return serializer;
2✔
241
        }
242

243
        return cachedSerializerMap.computeIfAbsent(cl, this::loadSerializer);
8✔
244
    }
245

246
    @SneakyThrows
3✔
247
    protected HessianSerializer loadSerializer(Class<?> cl) {
248
        HessianSerializer serializer;
249

250
        for (ISerializerFactory factory : factories) {
7!
251
            serializer = factory.getSerializer(cl);
×
252

253
            if (serializer != null) {
×
254
                return serializer;
×
255
            }
256
        }
×
257

258
        serializer = contextFactory.getSerializer(cl.getName());
6✔
259

260
        if (serializer != null) {
2✔
261
            return serializer;
2✔
262
        }
263

264
        ClassLoader loader = cl.getClassLoader();
3✔
265

266
        if (loader == null) {
2✔
267
            loader = SYSTEM_CLASS_LOADER;
2✔
268
        }
269

270
        ContextSerializerFactory factory = ContextSerializerFactory.create(loader);
3✔
271

272
        serializer = factory.getCustomSerializer(cl);
4✔
273

274
        if (serializer != null) {
2!
275
            return serializer;
×
276
        }
277

278
        if (HessianRemoteObject.class.isAssignableFrom(cl)) {
4!
279
            return new RemoteSerializer();
×
280
        } else if (InetAddress.class.isAssignableFrom(cl)) {
4✔
281
            return InetAddressSerializer.create();
2✔
282
        } else if (JavaSerializer.getWriteReplace(cl) != null) {
3✔
283
            HessianSerializer baseSerializer = getDefaultSerializer(cl);
4✔
284

285
            return new WriteReplaceSerializer(cl, getClassLoader(), baseSerializer);
8✔
286
        } else if (Map.class.isAssignableFrom(cl)) {
4✔
287
            if (mapSerializer == null) {
3✔
288
                mapSerializer = new MapSerializer();
5✔
289
            }
290

291
            return mapSerializer;
3✔
292
        } else if (Collection.class.isAssignableFrom(cl)) {
4✔
293
            if (collectionSerializer == null) {
3✔
294
                collectionSerializer = new CollectionSerializer();
5✔
295
            }
296

297
            return collectionSerializer;
3✔
298
        } else if (cl.isArray()) {
3✔
299
            return new ArraySerializer();
4✔
300
        } else if (Throwable.class.isAssignableFrom(cl)) {
4✔
301
            return new ThrowableSerializer(getDefaultSerializer(cl));
7✔
302
        } else if (InputStream.class.isAssignableFrom(cl)) {
4!
303
            return new InputStreamSerializer();
×
304
        } else if (Iterator.class.isAssignableFrom(cl)) {
4!
305
            return IteratorSerializer.create();
×
306
        } else if (Calendar.class.isAssignableFrom(cl)) {
4✔
307
            return CalendarSerializer.SER;
2✔
308
        } else if (Enumeration.class.isAssignableFrom(cl)) {
4✔
309
            return EnumerationSerializer.create();
2✔
310
        } else if (Enum.class.isAssignableFrom(cl)) {
4✔
311
            return new EnumSerializer(cl);
5✔
312
        } else if (Annotation.class.isAssignableFrom(cl)) {
4✔
313
            return new AnnotationSerializer(cl);
5✔
314
        }
315

316
        return getDefaultSerializer(cl);
4✔
317
    }
318

319
    /**
320
     * Returns the default serializer for a class that isn't matched
321
     * directly.  Application can override this method to produce
322
     * bean-style serialization instead of field serialization.
323
     *
324
     * @param cl the class of the object that needs to be serialized.
325
     *
326
     * @return a serializer object for the serialization.
327
     */
328
    protected HessianSerializer getDefaultSerializer(Class<?> cl) {
329
        if (defaultSerializer != null) {
3!
330
            return defaultSerializer;
×
331
        }
332

333
        if (!Serializable.class.isAssignableFrom(cl) && !isAllowNonSerializable) {
7!
334
            throw new IllegalStateException(
3✔
335
                    "Serialized class " + cl.getName() + " must implement java.io.Serializable");
4✔
336
        }
337

338
        if (isEnableUnsafeSerializer && JavaSerializer.getWriteReplace(cl) == null) {
6✔
339
            return UnsafeSerializer.create(cl);
3✔
340
        } else {
341
            return JavaSerializer.create(cl);
3✔
342
        }
343
    }
344

345
    /**
346
     * Returns the deserializer for a class.
347
     *
348
     * @param cl the class of the object that needs to be deserialized.
349
     *
350
     * @return a deserializer object for the serialization.
351
     */
352
    @Override
353
    public HessianDeserializer getDeserializer(Class<?> cl) throws HessianProtocolException {
354
        HessianDeserializer deserializer = cachedDeserializerMap.get(cl);
6✔
355

356
        if (deserializer != null) {
2✔
357
            return deserializer;
2✔
358
        }
359

360
        return cachedDeserializerMap.computeIfAbsent(cl, this::loadDeserializer);
8✔
361
    }
362

363
    @SneakyThrows
3✔
364
    protected HessianDeserializer loadDeserializer(Class<?> cl) {
365
        HessianDeserializer deserializer;
366

367
        for (ISerializerFactory factory : factories) {
7!
368
            deserializer = factory.getDeserializer(cl);
×
369

370
            if (deserializer != null) {
×
371
                return deserializer;
×
372
            }
373
        }
×
374

375
        // XXX: need test
376
        deserializer = contextFactory.getDeserializer(cl.getName());
6✔
377

378
        if (deserializer != null) {
2✔
379
            return deserializer;
2✔
380
        }
381

382
        ContextSerializerFactory factory;
383

384
        if (cl.getClassLoader() != null) {
3✔
385
            factory = ContextSerializerFactory.create(cl.getClassLoader());
5✔
386
        } else {
387
            factory = ContextSerializerFactory.create(SYSTEM_CLASS_LOADER);
3✔
388
        }
389

390
        deserializer = factory.getDeserializer(cl.getName());
5✔
391

392
        if (deserializer != null) {
2!
393
            return deserializer;
×
394
        }
395

396
        deserializer = factory.getCustomDeserializer(cl);
4✔
397

398
        if (deserializer != null) {
2!
399
            return deserializer;
×
400
        }
401

402
        if (Collection.class.isAssignableFrom(cl)) {
4✔
403
            deserializer = new CollectionDeserializer(cl);
6✔
404
        } else if (Map.class.isAssignableFrom(cl)) {
4✔
405
            deserializer = new MapDeserializer(cl);
6✔
406
        } else if (Iterator.class.isAssignableFrom(cl)) {
4!
407
            deserializer = IteratorDeserializer.create();
×
408
        } else if (Annotation.class.isAssignableFrom(cl)) {
4✔
409
            deserializer = new AnnotationDeserializer(cl);
6✔
410
        } else if (cl.isInterface()) {
3!
411
            deserializer = new ObjectDeserializer(cl);
×
412
        } else if (cl.isArray()) {
3✔
413
            deserializer = new ArrayDeserializer(cl.getComponentType());
7✔
414
        } else if (Enumeration.class.isAssignableFrom(cl)) {
4!
415
            deserializer = EnumerationDeserializer.create();
×
416
        } else if (Enum.class.isAssignableFrom(cl)) {
4✔
417
            deserializer = new EnumDeserializer(cl);
6✔
418
        } else if (Class.class.equals(cl)) {
4✔
419
            deserializer = new ClassDeserializer(getClassLoader());
7✔
420
        } else if (java.util.BitSet.class.equals(cl)) {
4✔
421
            deserializer = new BitSetDeserializer(fieldDeserializer2Factory);
7✔
422
        } else if (Calendar.class.isAssignableFrom(cl)) {
4✔
423
            deserializer = new CalendarDeserializer(cl);
6✔
424
        } else {
425
            deserializer = getDefaultDeserializer(cl);
4✔
426
        }
427

428
        return deserializer;
2✔
429
    }
430

431
    /**
432
     * Returns a custom serializer the class
433
     *
434
     * @param cl the class of the object that needs to be serialized.
435
     *
436
     * @return a serializer object for the serialization.
437
     */
438
    protected HessianDeserializer getCustomDeserializer(Class<?> cl) {
439
        try {
440
            Class<?> serClass = Class.forName(cl.getName() + "HessianDeserializer", false, cl.getClassLoader());
×
441

442
            return (HessianDeserializer) serClass.getDeclaredConstructor().newInstance();
×
443
        } catch (ClassNotFoundException e) {
×
444
            log.log(Level.FINEST, e.toString(), e);
×
445

446
            return null;
×
447
        } catch (Exception e) {
×
448
            log.log(Level.FINE, e.toString(), e);
×
449

450
            return null;
×
451
        }
452
    }
453

454
    /**
455
     * Returns the default serializer for a class that isn't matched
456
     * directly.  Application can override this method to produce
457
     * bean-style serialization instead of field serialization.
458
     *
459
     * @param cl the class of the object that needs to be serialized.
460
     *
461
     * @return a serializer object for the serialization.
462
     */
463
    protected HessianDeserializer getDefaultDeserializer(Class<?> cl) {
464
        if (InputStream.class.equals(cl)) {
4!
465
            return InputStreamDeserializer.DESER;
×
466
        }
467

468
        if (isEnableUnsafeSerializer) {
3✔
469
            return new UnsafeDeserializer(cl, fieldDeserializer2Factory);
7✔
470
        } else {
471
            return new JavaDeserializer(cl, fieldDeserializer2Factory);
7✔
472
        }
473
    }
474

475
    /**
476
     * Reads the object as a list.
477
     */
478
    public Object readList(AbstractHessianDecoder in, int length, String type) throws IOException {
479
        HessianDeserializer deserializer = getDeserializer(type);
4✔
480

481
        if (deserializer != null) {
2✔
482
            return deserializer.readList(in, length);
5✔
483
        } else {
484
            return new CollectionDeserializer(ArrayList.class).readList(in, length);
8✔
485
        }
486
    }
487

488
    /**
489
     * Reads the object as a map.
490
     */
491
    public Object readMap(AbstractHessianDecoder in, String type) throws IOException {
492
        HessianDeserializer deserializer = getDeserializer(type);
4✔
493

494
        if (deserializer != null) {
2✔
495
            return deserializer.readMap(in);
4✔
496
        } else if (hashMapDeserializer != null) {
3!
497
            return hashMapDeserializer.readMap(in);
5✔
498
        } else {
499
            hashMapDeserializer = new MapDeserializer(HashMap.class);
×
500

501
            return hashMapDeserializer.readMap(in);
×
502
        }
503
    }
504

505
    /**
506
     * Reads the object as a map.
507
     */
508
    public Object readObject(AbstractHessianDecoder in, String type, String[] fieldNames) throws IOException {
509
        HessianDeserializer deserializer = getDeserializer(type);
×
510

511
        if (deserializer != null) {
×
512
            return deserializer.readObject(in, fieldNames);
×
513
        } else if (hashMapDeserializer != null) {
×
514
            return hashMapDeserializer.readObject(in, fieldNames);
×
515
        } else {
516
            hashMapDeserializer = new MapDeserializer(HashMap.class);
×
517

518
            return hashMapDeserializer.readObject(in, fieldNames);
×
519
        }
520
    }
521

522
    /**
523
     * Reads the object as a map.
524
     */
525
    public HessianDeserializer getObjectDeserializer(String type, Class<?> cl) throws HessianProtocolException {
526
        HessianDeserializer reader = getObjectDeserializer(type);
4✔
527

528
        if (cl == null
4✔
529
                || cl.equals(reader.getType())
5✔
530
                || cl.isAssignableFrom(reader.getType())
4✔
531
                || reader.isReadResolve()
4✔
532
                || Hessian2Handle.class.isAssignableFrom(reader.getType())) {
3!
533
            return reader;
2✔
534
        }
535

536
        if (log.isLoggable(Level.FINE)) {
4!
537
            log.fine("hessian: expected deserializer '" + cl.getName() + "' at '" + type + "' ("
×
538
                    + reader.getType().getName() + ")");
×
539
        }
540

541
        return getDeserializer(cl);
4✔
542
    }
543

544
    /**
545
     * Reads the object as a map.
546
     */
547
    public HessianDeserializer getObjectDeserializer(String type) throws HessianProtocolException {
548
        HessianDeserializer deserializer = getDeserializer(type);
4✔
549

550
        if (deserializer != null) {
2✔
551
            return deserializer;
2✔
552
        } else if (hashMapDeserializer != null) {
3✔
553
            return hashMapDeserializer;
3✔
554
        } else {
555
            hashMapDeserializer = new MapDeserializer(HashMap.class);
6✔
556

557
            return hashMapDeserializer;
3✔
558
        }
559
    }
560

561
    /**
562
     * Reads the object as a map.
563
     */
564
    public HessianDeserializer getListDeserializer(String type, Class<?> cl) throws HessianProtocolException {
565
        HessianDeserializer reader = getListDeserializer(type);
4✔
566

567
        if (cl == null || cl.equals(reader.getType()) || cl.isAssignableFrom(reader.getType())) {
12✔
568
            return reader;
2✔
569
        }
570

571
        if (log.isLoggable(Level.FINE)) {
4!
572
            log.fine("hessian: expected '" + cl.getName() + "' at '" + type + "' ("
×
573
                    + reader.getType().getName() + ")");
×
574
        }
575

576
        return getDeserializer(cl);
4✔
577
    }
578

579
    /**
580
     * Reads the object as a map.
581
     */
582
    public HessianDeserializer getListDeserializer(String type) throws HessianProtocolException {
583
        HessianDeserializer deserializer = getDeserializer(type);
4✔
584

585
        if (deserializer != null) {
2✔
586
            return deserializer;
2✔
587
        } else if (arrayListDeserializer != null) {
3✔
588
            return arrayListDeserializer;
3✔
589
        } else {
590
            arrayListDeserializer = new CollectionDeserializer(ArrayList.class);
6✔
591

592
            return arrayListDeserializer;
3✔
593
        }
594
    }
595

596
    /**
597
     * Returns a deserializer based on a string type.
598
     */
599
    public HessianDeserializer getDeserializer(String type) throws HessianProtocolException {
600
        if (type == null || type.isEmpty()) {
5!
601
            return null;
2✔
602
        }
603

604
        HessianDeserializer deserializer = cachedTypeDeserializerMap.get(type);
6✔
605

606
        if (deserializer != null) {
2✔
607
            return deserializer;
2✔
608
        }
609

610
        deserializer = STATIC_TYPE_MAP.get(type);
5✔
611
        if (deserializer != null) {
2✔
612
            return deserializer;
2✔
613
        }
614

615
        if (type.startsWith("[")) {
4✔
616
            HessianDeserializer subDeserializer = getDeserializer(type.substring(1));
6✔
617

618
            if (subDeserializer != null) {
2✔
619
                deserializer = new ArrayDeserializer(subDeserializer.getType());
7✔
620
            } else {
621
                deserializer = new ArrayDeserializer(Object.class);
5✔
622
            }
623
        } else {
1✔
624
            try {
625
                Class<?> cl = loadSerializedClass(type);
4✔
626

627
                deserializer = getDeserializer(cl);
4✔
628
            } catch (Exception e) {
1✔
629
                log.warning("Hessian2: '" + type + "' is an unknown class in " + getClassLoader() + ":\n" + e);
9✔
630

631
                log.log(Level.FINER, e.toString(), e);
6✔
632
            }
1✔
633
        }
634

635
        if (deserializer != null) {
2✔
636
            cachedTypeDeserializerMap.putIfAbsent(type, deserializer);
6✔
637
        }
638

639
        return deserializer;
2✔
640
    }
641

642
    private static void addBasic(String typeName, int type) {
643
        HessianDeserializer deserializer = new BasicDeserializer(type);
5✔
644

645
        STATIC_TYPE_MAP.put(typeName, deserializer);
5✔
646
    }
1✔
647

648
    static {
649
        STATIC_TYPE_MAP = new HashMap<>();
4✔
650

651
        addBasic("void", BasicSerializer.NULL);
3✔
652

653
        addBasic("boolean", BasicSerializer.BOOLEAN);
3✔
654
        addBasic("byte", BasicSerializer.BYTE);
3✔
655
        addBasic("short", BasicSerializer.SHORT);
3✔
656
        addBasic("int", BasicSerializer.INTEGER);
3✔
657
        addBasic("long", BasicSerializer.LONG);
3✔
658
        addBasic("float", BasicSerializer.FLOAT);
3✔
659
        addBasic("double", BasicSerializer.DOUBLE);
3✔
660
        addBasic("char", BasicSerializer.CHARACTER_OBJECT);
3✔
661
        addBasic("string", BasicSerializer.STRING);
3✔
662
        addBasic("string", BasicSerializer.STRING_BUILDER);
3✔
663
        addBasic("object", BasicSerializer.OBJECT);
3✔
664
        addBasic("date", BasicSerializer.DATE);
3✔
665

666
        addBasic("boolean", BasicSerializer.BOOLEAN);
3✔
667
        addBasic("byte", BasicSerializer.BYTE);
3✔
668
        addBasic("short", BasicSerializer.SHORT);
3✔
669
        addBasic("int", BasicSerializer.INTEGER);
3✔
670
        addBasic("long", BasicSerializer.LONG);
3✔
671
        addBasic("float", BasicSerializer.FLOAT);
3✔
672
        addBasic("double", BasicSerializer.DOUBLE);
3✔
673
        addBasic("char", BasicSerializer.CHARACTER);
3✔
674

675
        addBasic("[boolean", BasicSerializer.BOOLEAN_ARRAY);
3✔
676
        addBasic("[byte", BasicSerializer.BYTE_ARRAY);
3✔
677
        addBasic("[short", BasicSerializer.SHORT_ARRAY);
3✔
678
        addBasic("[int", BasicSerializer.INTEGER_ARRAY);
3✔
679
        addBasic("[long", BasicSerializer.LONG_ARRAY);
3✔
680
        addBasic("[float", BasicSerializer.FLOAT_ARRAY);
3✔
681
        addBasic("[double", BasicSerializer.DOUBLE_ARRAY);
3✔
682
        addBasic("[char", BasicSerializer.CHARACTER_ARRAY);
3✔
683
        addBasic("[string", BasicSerializer.STRING_ARRAY);
3✔
684
        addBasic("[object", BasicSerializer.OBJECT_ARRAY);
3✔
685

686
        HessianDeserializer objectDeserializer = new JavaDeserializer(Object.class, new FieldDeserializer2Factory());
8✔
687
        STATIC_TYPE_MAP.put("object", objectDeserializer);
5✔
688
        STATIC_TYPE_MAP.put(HessianRemote.class.getName(), RemoteDeserializer.DESER);
6✔
689

690
        SYSTEM_CLASS_LOADER = ClassLoader.getSystemClassLoader();
2✔
691
    }
1✔
692
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc