stride3d/stride · error · InvalidOperationException

Trying to serialize a Buffer without CPU info.

Error message

Trying to serialize a Buffer without CPU info.

What it means

BufferSerializer.Serialize can only write a Buffer's raw data when the buffer carries CPU-accessible serialization info (BufferSerializationData via GetSerializationData). Buffers created without that CPU info (e.g. GPU-only Default-usage buffers) cannot be dumped to the stream, so Serialize throws InvalidOperationException.

Solutions

  1. Ensure the buffer keeps CPU data (create from CPU data / keep serialization data) before serialization.
  2. Re-upload the data from the CPU source and re-create the buffer with serialization info.
  3. Skip serializing GPU-only buffers, or store a recipe to regenerate them at load time.

Example fix

// before
var gpuOnly = Buffer.New(device, 1024, BufferFlags.VertexBuffer, GraphicsResourceUsage.Default);
serializer.Serialize(stream, gpuOnly); // throws
// after
var withData = Buffer.New(device, cpuData, BufferFlags.VertexBuffer); // keeps CPU info
serializer.Serialize(stream, withData);
Defensive patterns

Strategy: try-catch

Validate before calling

if (buffer.GetSerializationData() == null)
    throw new InvalidOperationException("Buffer has no CPU data to serialize");

Type guard

bool CanSerialize(Buffer b) => b.GetSerializationData() != null;

Try / catch

try { serializer.Serialize(stream, buffer); }
catch (InvalidOperationException ex) when (ex.Message.Contains("without CPU info"))
{
    // regenerate from CPU source instead of serializing GPU-only buffer
}

Prevention

When it happens

Trigger: Serializing/packaging a scene or asset whose buffer was created without CPU-side data (not Staging/managed serialization-friendly flags), so GetSerializationData() returns null.

Common situations: Saving a runtime-generated GPU buffer into an asset bundle; serializing a mesh whose vertex buffer was uploaded as Default usage and discarded from CPU memory.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14). Data as JSON: /api/errors/e50f022aa9da64bf. Report an issue: GitHub.

Appendix: source

Thrown at sources/engine/Stride.Graphics/Data/BufferSerializer.cs:74

                            var loadedBufferData = assetManager.Load<Buffer>(url);
                            try
                            {
                                var data = loadedBufferData.GetSerializationData().Content;
                                ((Buffer)graphicsResource).Recreate(data);
                            }
                            finally
                            {
                                assetManager.Unload(loadedBufferData);
                            }
                        };
                    }
                }
            }
            else
            {
                var bufferData = buffer.GetSerializationData();
                if (bufferData == null)
                    throw new InvalidOperationException("Trying to serialize a Buffer without CPU info.");

                stream.Write(bufferData);
            }
        }
    }
}

View on GitHub (pinned to 96fad776d2)