> For the complete documentation index, see [llms.txt](https://postica.gitbook.io/binding-system-3/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://postica.gitbook.io/binding-system-3/project-tools/diagnostics/reserializer.md).

# Reserializer

Keeping values intact when a field changes to or from a bind type.

Changing `public float speed;` to `public Bind<float> speed;` changes the serialized shape of the field. Unity's answer to that is to drop the old value, which means every object that had a speed set now has zero.

The **Reserializer** intercepts exactly that change and carries the value across.

## What it handles

<table><thead><tr><th width="290">Change</th><th>What happens to the value</th></tr></thead><tbody><tr><td><code>T</code> → <code>Bind&#x3C;T></code></td><td>The value becomes the bind field's unbound value.</td></tr><tr><td><code>Bind&#x3C;T></code> → <code>T</code></td><td>The unbound value becomes the plain value. A binding on the field is lost, since there is nowhere to keep it.</td></tr><tr><td>Between bind variants</td><td><code>Bind&#x3C;T></code> to <code>ReadOnlyBind&#x3C;T></code> and similar.</td></tr></tbody></table>

## Enabling it

The Reserializer is **off by default in 3.x**, and its toggle is not shown in the settings page unless the project defines the `BS_LEGACY_SUPPORT` scripting define symbol.

The reasoning: it is a migration tool. Most projects need it for a few days while they adopt bind fields, and then never again, and it does real work on every import for the rest of the project's life.

To enable it:

1. **Project Settings ▸ Player ▸ Scripting Define Symbols**, add `BS_LEGACY_SUPPORT`.
2. **Project Settings ▸ Binding System ▸ Optimization**, turn on **Auto Conversion**.

{% hint style="danger" %}
**Back up or commit before enabling it.** The Reserializer rewrites serialized data across your scenes, prefabs and assets. It is careful, and a restore point costs nothing.
{% endhint %}

## What to expect the first time

The first compilation after enabling takes noticeably longer, because a database of the project's current fields is being built. That database is what later comparisons are made against.

## Requirements and limits

<table><thead><tr><th width="290">Requirement</th><th>What is needed</th></tr></thead><tbody><tr><td>Asset serialization</td><td>Must be <strong>Force Text</strong>. The Reserializer edits YAML.</td></tr><tr><td><code>[SerializeReference]</code> fields</td><td>Not supported. A polymorphic field is left alone rather than converted incorrectly.</td></tr></tbody></table>

## Adopting bind fields without it

For a small project, or a careful one, the manual route is often less work than the migration machinery:

1. Change the field type to `Bind<T>`.
2. Set the values again in the Inspector, or in a one-off script.
3. Done.

For a large project mid-flight, turn the Reserializer on for the conversion, verify, then turn it off again.

## Related pages

* [Bind Types](/binding-system-3/overview/bind-types.md): what the field becomes.
* [Refactoring](/binding-system-3/project-tools/diagnostics/refactoring.md): the neighbouring problem, when a member is renamed rather than retyped.
* [Upgrading from Binding System 2](/binding-system-3/getting-started/upgrading.md): where this setting went.
