Troubleshooting
This page covers common issues and solutions when using cross-language serialization.
Type Registration Errors
"Type not registered" Error
Symptom:
Error: Type 'example.Person' is not registered
Cause: The type was not registered before deserialization, or the type name doesn't match.
Solution:
-
Ensure the type is registered with the same name on both sides:
// Java
fory.register(Person.class, "example.Person");# Python
fory.register_type(Person, typename="example.Person") -
Check for typos or case differences in type names
-
Register types before any serialization/deserialization calls
"Type ID mismatch" Error
Symptom:
Error: Expected type ID 100, got 101
Cause: Different type IDs used across languages.
Solution: Use consistent type IDs:
// Java
fory.register(Person.class, 100);
fory.register(Address.class, 101);
# Python
fory.register_type(Person, type_id=100)
fory.register_type(Address, type_id=101)
Type Mapping Issues
Integer Overflow
Symptom: Values are truncated or wrapped unexpectedly.
Cause: Using different integer sizes across languages.
Solution:
-
In Python, use explicit type annotations:
@dataclass
class Data:
value: pyfory.Int32Type # Not just 'int' -
Ensure integer ranges are compatible:
int8: -128 to 127int16: -32,768 to 32,767int32: -2,147,483,648 to 2,147,483,647
Float Precision Loss
Symptom: Float values have unexpected precision.
Cause: Mixing float32 and float64 types.
Solution:
-
Use consistent float types:
@dataclass
class Data:
value: pyfory.Float32Type # Explicit 32-bit float -
Be aware that Python's
floatmaps tofloat64by default
String Encoding Errors
Symptom:
Error: Invalid UTF-8 sequence
Cause: Non-UTF-8 encoded strings.
Solution:
-
Ensure all strings are valid UTF-8
-
In Python, decode bytes before serialization:
text = raw_bytes.decode('utf-8')
Field Order Issues
"Field mismatch" Error
Symptom: Deserialized objects have wrong field values.
Cause: Field order differs between languages.
Solution: Fory sorts fields by their snake_cased names. Ensure field names are consistent:
// Java - fields will be sorted: age, email, name
public class Person {
public String name;
public int age;
public String email;
}
# Python - same field order
@dataclass
class Person:
name: str
age: pyfory.Int32Type
email: str
Reference Tracking Issues
Stack Overflow with Circular References
Symptom:
StackOverflowError or RecursionError
Cause: Reference tracking is disabled but data has circular references.
Solution: Enable reference tracking:
// Java
Fory fory = Fory.builder()
.withLanguage(Language.XLANG)
.withRefTracking(true)
.build();
# Python
fory = pyfory.Fory(ref_tracking=True)
Duplicate Objects
Symptom: Shared objects are duplicated after deserialization.
Cause: Reference tracking is disabled.
Solution: Enable reference tracking if objects are shared within the graph.
Language Mode Issues
Incompatible Types in Xlang Mode
Symptom:
Error: Type 'Optional' is not supported in xlang mode
Cause: Using Java-specific types that don't have cross-language equivalents.
Solution: Use compatible types:
// Instead of Optional<String>
public String email; // nullable
// Instead of BigDecimal
public double amount;
// Instead of EnumSet<Status>
public Set<Status> statuses;
Version Compatibility
Serialization Format Changed
Symptom: Deserialization fails after upgrading Fory.
Cause: Breaking changes in serialization format.
Solution:
- Ensure all services use compatible Fory versions
- Check release notes for breaking changes
- Consider using schema evolution (compatible mode) for gradual upgrades
Debugging Tips
Enable Debug Logging
Java:
// Add to JVM options
-Dfory.debug=true
Python:
import logging
logging.getLogger('pyfory').setLevel(logging.DEBUG)
Inspect Serialized Data
Use hex dump to inspect the binary format:
data = fory.serialize(obj)
print(data.hex())
Test Round-Trip
Always test round-trip serialization in each language:
byte[] bytes = fory.serialize(obj);
Object result = fory.deserialize(bytes);
assert obj.equals(result);
Cross-Language Testing
Test serialization across all target languages before deployment:
# Serialize in Java
java -jar serializer.jar > data.bin
# Deserialize in Python
python deserializer.py data.bin
Common Mistakes
- Not registering types: Always register custom types before use
- Inconsistent type names/IDs: Use the same names/IDs across all languages
- Forgetting xlang mode: Use
Language.XLANGin Java - Wrong type annotations: Use
pyfory.Int32Typeetc. in Python - Ignoring reference tracking: Enable for circular/shared references
See Also
- Type Mapping - Cross-language type mapping reference
- Getting Started - Setup guide
- Java Troubleshooting - Java-specific issues
- Python Troubleshooting - Python-specific issues