| title | Troubleshooting |
|---|---|
| sidebar_position | 70 |
| id | troubleshooting |
| license | Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. |
This page covers common issues and solutions when using cross-language serialization.
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
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)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
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
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')
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: strSymptom:
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(xlang=True, ref=True)Symptom: Shared objects are duplicated after deserialization.
Cause: Reference tracking is disabled.
Solution: Enable reference tracking if objects are shared within the graph.
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;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
Java:
// Add to JVM options
-Dfory.debug=truePython:
import logging
logging.getLogger('pyfory').setLevel(logging.DEBUG)Use hex dump to inspect the binary format:
data = fory.serialize(obj)
print(data.hex())Always test round-trip serialization in each language:
byte[] bytes = fory.serialize(obj);
Object result = fory.deserialize(bytes);
assert obj.equals(result);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- 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
- Type Mapping - Cross-language type mapping reference
- Getting Started - Setup guide
- Java Troubleshooting - Java-specific issues
- Python Troubleshooting - Python-specific issues