Registry / serialization / javaobj-py3

javaobj-py3

JSON →
library0.6.1pypypi✓ verified 21d ago

javaobj-py3 is a Python library designed for serializing and de-serializing Java objects, facilitating interoperability between Python and Java applications. It is currently at version 0.4.4 and receives irregular but active updates, with the latest significant features and fixes released recently.

pip install javaobj-py3
INSTALL
IMPORT
SIG · JAVAOBJ-PY3
J
javaobj-py3
serializationpythonv0.6.1
Install
1.5s avg
Import
40ms
Disk
17MB
Pass rate
10/ 10
Env Coverage10 / 10
glibc
3.93.13
musl
3.93.13
Install & Compatibility
Where this runs
tested against v0.6.1 · pip install
no network on importno background threads
Install × environment matrix
Each cell = how many times install + import succeeded across repeated harness runs. Partial = flaky.
glibc = Debian/Ubuntu slim · musl = Alpine Linux
musl
py 3.103.95 runs
installs and imports cleanly · install 0.0s · import 0.042s · 18.4MB
glibc
py 3.103.95 runs
installs and imports cleanly · install 1.5s · import 0.038s · 19MB
17MB installed
● package 17MB
Code
Verified usage

Verified import paths — ran on the pinned version, not inferred.

loads
from javaobj import loads
dumps
from javaobj import dumps
Only available with the default 'v1' parser; the 'v2' parser does not support serialization.
JavaObject
from javaobj import JavaObject
Represents a deserialized custom Java object or can be used to construct objects for serialization.
v2_loads
from javaobj.v2 import loads as v2_loads
The more robust 'v2' deserializer, recommended for complex Java streams, but it cannot serialize.

This quickstart demonstrates how to deserialize common Java types (String, List) into their Python equivalents using `javaobj.loads()`. It also shows a basic example of serializing a Python string to Java format using `javaobj.dumps()` and introduces the `v2_loads` parser for advanced deserialization.

import javaobj # 1. Deserializing a simple Java String # Bytes represent a serialized Java String "Hello, World!" java_serialized_string = b'\xac\xed\x00\x05t\x00\x0cHello, World!' python_string = javaobj.loads(java_serialized_string) print(f"Deserialized Java String: '{python_string}' (Python type: {type(python_string)})") # 2. Deserializing a Java object that maps to a Python list # Bytes for a serialized Java ArrayList containing "One" and "Two" java_list_bytes = b'\xac\xed\x00\x05sr\x00\x13java.util.ArrayListx\x81\xd2\x1d\x99\xc7\xed\x11\x00\x02\x00\x00xp\x00\x00\x00\x02w\x04\x00\x00\x00\x02t\x00\x03Onet\x00\x03Twoe\x00' python_list = javaobj.loads(java_list_bytes) print(f"Deserialized Java List: {python_list} (Python type: {type(python_list)})") # 3. Basic Serialization (available via the default v1 implementation) # Serializing a Python string back into Java format serialized_bytes = javaobj.dumps("Python data") print(f"Serialized 'Python data' (first 20 bytes): {serialized_bytes[:20]}...") # 4. Deserializing using the v2 parser for potentially better compatibility # (Note: For this simple string, output will be identical) from javaobj.v2 import loads as v2_loads python_string_v2 = v2_loads(java_serialized_string) print(f"Deserialized (v2) Java String: '{python_string_v2}' (Python type: {type(python_string_v2)})")
Debug
Known issues
breakingVersion 0.4.0 introduced a new 'v2' parser (`javaobj.v2`) which is more capable for deserialization but *does not support serialization* (`dumps`). The default `javaobj.loads` and `javaobj.dumps` still use the older 'v1' parser. Using `v2` for deserialization means you cannot serialize with it.
fix
Choose the appropriate parser: use `javaobj.loads` (v1) for both loading and dumping, or `javaobj.v2.loads` for more robust loading if serialization is not needed. Be explicit in your imports to avoid confusion.
affects: >=0.4.0
gotchaNumPy is an optional dependency. If you intend to deserialize Java numeric arrays into NumPy arrays, ensure 'numpy' is installed (`pip install numpy`). The library loads NumPy lazily, only when `use_numpy_arrays` is explicitly requested during unmarshalling (e.g., `javaobj.loads(bytes_data, use_numpy_arrays=True)`).
fix
Install 'numpy' if you need NumPy array support: `pip install numpy`. Pass `use_numpy_arrays=True` to `javaobj.loads()` or `JavaObjectUnmarshaller` if you expect NumPy arrays.
affects: >=0.2.3
gotchaThe `javaobj.load()` function (for file-like objects) can transparently handle GZipped Java serialization streams. However, `javaobj.loads()` (for bytes in memory) expects raw bytes and will not automatically decompress GZipped input.
fix
If working with GZipped bytes in memory, decompress them manually before passing to `javaobj.loads()` (e.g., using `gzip.decompress`). For file paths or open file objects, prefer `javaobj.load()`.
affects: >=0.4.3
gotchaPrimitive Java types (e.g., `java.lang.String`, `java.lang.Integer`, `java.lang.Boolean`) are deserialized into their equivalent native Python types (`str`, `int`, `bool`). Custom Java classes or complex collections (like `ArrayList`, `HashMap`) are typically mapped to `javaobj.JavaObject` instances, requiring attribute access (e.g., `obj.fieldName`).
fix
Be aware of the type mapping. Check `type(result)` after `loads()` and use `isinstance(result, javaobj.JavaObject)` if you expect custom Java objects to access their fields.
affects: all
gotchaWhile the library supports decoding CESU-8 strings (common in older Java serialization), character encoding issues can still arise with non-standard or malformed input. Ensure the Java side uses standard UTF-8 or be prepared to handle specific encoding issues.
fix
Verify the encoding used on the Java side. If issues persist, consider inspecting the raw bytes or implementing custom object transformers to debug encoding problems.
affects: all
Errors
Common errors & fixes
IOError: The stream is not java serialized object. Invalid stream header: ACED0573
The input byte stream does not start with the magic number and version (AC ED 00 05) that identifies a standard Java serialized object stream, indicating the data is not a valid Java serialized object.
fix
Ensure the input bytes object or file stream contains correctly serialized Java objects. Verify the source of the data and its serialization method.
RuntimeError: Stream has been ended unexpectedly while unmarshaling.
The input byte stream ended prematurely before a complete Java object could be deserialized, often indicating truncated or corrupted serialized data.
fix
Provide a complete and uncorrupted Java serialized byte stream. Check if the entire serialized object data was read from the source (e.g., file, network stream).
RuntimeError: Unknown OpCode in the stream: 0x... (at offset 0x...)
The javaobj-py3 parser encountered an unrecognized opcode (byte sequence) in the Java serialized stream, suggesting a malformed stream, a version of Java serialization not fully supported, or unsupported complex Java objects.
fix
If using an older version, try deserializing with `javaobj.v2` (e.g., `import javaobj.v2 as javaobj`) as it's based on `jdeserialize` and supports more cases. Otherwise, simplify the Java objects being serialized or investigate the exact Java serialization format being used.
AttributeError: 'JavaObject' object has no attribute 'someAttribute'
After deserializing a Java object, you are trying to access an attribute (field) that either does not exist in the original Java class or `javaobj-py3` could not properly map to a Python attribute.
fix
Inspect the deserialized `JavaObject` structure (e.g., `print(pobj.__dict__)` or `dir(pobj)`) to see the available attributes. Ensure the attribute name matches the expected Java field name. For complex Java objects, custom object transformers might be needed to map Java fields to Python attributes correctly.
Upgrade
Version history
0.6.1latest on PyPI · released Aug 12, 2026
Audit
Dependencies
numpyoptionalOptional dependency for loading numeric arrays as NumPy arrays. It is loaded lazily only when explicitly requested.
Agent activity
5 hits · last 30 days
node
4
Resources
javaobj-py3 — pip install javaobj-py3 · libregistry