# Serialization

> USearch for C#

Checkpoints ride the SafeGraphs interchange format, and the path extension picks the layout: a `.safegraphs` path is one monolith, a `.safegraphs.json` path is a manifest cataloging many.
Checkpoints are residency-portable: one file materializes into RAM, uploads to the devices, or opens in place on disk, decided by the constructor that opens it.

```csharp
await index.Deferred(pool).Save("index.safegraphs");                        // Or: index.On(pool).Save(path)

DenseMetadata metadata = DenseIndex.MetadataRead("index.safegraphs", pool);  // Geometry without loading

using DenseIndex restored = DenseIndex.LoadRam("index.safegraphs", executor: pool); // Checkpoint freezes the geometry
using DenseIndex served = DenseIndex.ViewRam("index.safegraphs");                    // Mapped in place, read-only

Monolith buffer = index.On(pool).SaveBuffer(arena);                         // Or one monolith in memory
using DenseIndex copied = DenseIndex.LoadRamBuffer(buffer.Bytes, executor: pool);
```

`DenseMetadata` carries the four fields a checkpoint froze: dimensions, metric, quantization and connectivity.
Residency is absent because a checkpoint records where it was written rather than where a reader must keep it, and `ValuesPerKey` is absent because it bounds a live handle's mutable state rather than the serialized form.
A monolith reports its `Length` as a `long`, and one past 2 GiB refuses to lend its `Bytes` as one run of memory with `Status.Overflow`.

