blob: 8e6a5d1615c683d1c559a5cf20d1900ecbafbebe [file] [log] [blame] [view]
---
title: Troubleshooting
sidebar_position: 13
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 their solutions.
## Common Issues
### ImportError with Format Features
```python
# Solution: Install Row format support
pip install pyfory[format]
# Or install from source with format support
pip install -e ".[format]"
```
### Slow Serialization Performance
```python
# Check if Cython acceleration is enabled
import pyfory
print(pyfory.ENABLE_FORY_CYTHON_SERIALIZATION) # Should be True
# If False, Cython extension may not be compiled correctly
# Reinstall with: pip install --force-reinstall --no-cache-dir pyfory
```
### Cross-Language Compatibility Issues
```python
# Use explicit type registration with consistent naming
f = pyfory.Fory(xlang=True)
f.register(MyClass, typename="com.package.MyClass") # Use same name in all languages
```
### Circular Reference Errors or Duplicate Data
```python
# Enable reference tracking
f = pyfory.Fory(ref=True) # Required for circular references
# Example with circular reference
class Node:
def __init__(self, value):
self.value = value
self.next = None
node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1 # Circular reference
data = f.dumps(node1)
result = f.loads(data)
assert result.next.next is result # Circular reference preserved
```
### Schema Evolution Not Working
```python
# Enable compatible mode for schema evolution
f = pyfory.Fory(xlang=True, compatible=True)
# Version 1: Original class
@dataclass
class User:
name: str
age: int
f.register(User, typename="User")
data = f.dumps(User("Alice", 30))
# Version 2: Add new field (backward compatible)
@dataclass
class User:
name: str
age: int
email: str = "unknown@example.com" # New field with default
# Can still deserialize old data
user = f.loads(data)
print(user.email) # "unknown@example.com"
```
### Type Registration Errors in Strict Mode
```python
# Register all custom types before serialization
f = pyfory.Fory(strict=True)
# Must register before use
f.register(MyClass, type_id=100)
f.register(AnotherClass, type_id=101)
# Or disable strict mode (NOT recommended for production)
f = pyfory.Fory(strict=False) # Use only in trusted environments
```
## Debug Mode
Set environment variable BEFORE importing pyfory to disable Cython for debugging:
```python
import os
os.environ['ENABLE_FORY_CYTHON_SERIALIZATION'] = '0'
import pyfory # Now uses pure Python implementation
# This is useful for:
# 1. Debugging protocol issues
# 2. Understanding serialization behavior
# 3. Development without recompiling Cython
```
## Error Handling
Handle common serialization errors gracefully:
```python
import pyfory
from pyfory.error import TypeUnregisteredError, TypeNotCompatibleError
fory = pyfory.Fory(strict=True)
try:
data = fory.dumps(my_object)
except TypeUnregisteredError as e:
print(f"Type not registered: {e}")
# Register the type and retry
fory.register(type(my_object), type_id=100)
data = fory.dumps(my_object)
except Exception as e:
print(f"Serialization failed: {e}")
try:
obj = fory.loads(data)
except TypeNotCompatibleError as e:
print(f"Schema mismatch: {e}")
# Handle version mismatch
except Exception as e:
print(f"Deserialization failed: {e}")
```
## Development Setup
```bash
git clone https://github.com/apache/fory.git
cd fory/python
# Install dependencies
pip install -e ".[dev,format]"
# Run tests
pytest -v -s .
# Run specific test
pytest -v -s pyfory/tests/test_serializer.py
# Format code
ruff format .
ruff check --fix .
```
## Related Topics
- [Configuration](configuration.md) - Fory parameters
- [Type Registration](type-registration.md) - Registration best practices
- [Security](security.md) - Security configuration