## Serde Options
Use the `@serde` decorator to customize deserialization:
### Renaming Fields
<MacroExample before={data.examples.rename.before} after={data.examples.rename.after} />
```typescript
const user = User.fromJSON({ user_id: '123', full_name: 'Alice' });
console.log(user.id); // "123"
console.log(user.name); // "Alice"
```
### Default Values
<MacroExample before={data.examples.default.before} after={data.examples.default.after} />
```typescript
const config = Config.fromJSON({ host: 'localhost' });
console.log(config.port); // "3000"
console.log(config.debug); // false
```
### Skipping Fields
<InteractiveMacro code={`/** @derive(Deserialize) */ class User { name: string; email: string;
/** @serde({ skip: true }) */ cachedData: unknown;
/** @serde({ skip_deserializing: true }) */ computedField: string; }`} />
<Alert type="tip" title="skip vs skip_deserializing">
Use `skip: true` to exclude from both serialization and deserialization.
Use `skip_deserializing: true` to only skip during deserialization.
</Alert>
### Deny Unknown Fields
<InteractiveMacro
code={`/** @derive(Deserialize) */
/** @serde({ deny_unknown_fields: true }) */
class StrictUser {
name: string;
email: string;
}`}
/>
```typescript
// This will throw an error
StrictUser.fromJSON({ name: 'Alice', email: 'a@b.com', extra: 'field' });
// Error: StrictUser.fromJSON: unknown field "extra"
```
### Flatten Nested Objects
<InteractiveMacro code={`/** @derive(Deserialize) */ class Address { city: string; zip: string; }
/** @derive(Deserialize) */ class User { name: string;
/** @serde({ flatten: true }) */ address: Address; }`} />
```typescript
// Flat JSON structure
const user = User.fromJSON({
name: 'Alice',
city: 'NYC',
zip: '10001'
});
console.log(user.address.city); // "NYC"
```