## 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"
```