first you need to understand how pre-render works.
if the blazor app supports pre-render, on the first request, the server creates a blazor app, and runs pre-render event to produce the html content of the app div. the response also contains the blazor javascript bootstrap code. at this point the the blazor app is shut down as the request is completed.
when the page is loaded by the browser, it displays the pre-render html, and runs the blazor bootstrap javascript code. if WASM, it loads the blazor app, and starts it running, or if server blazor create a new server request which opens a circuit and starts a new server blazor app instance.
after the new blazor app starts (WASM or Server), it produces new app html which replace the pre-render html.
now to pass pre-render state to the new blazor interactive instance, the persist data is just rendered on the pre-render page along with the pre-rendered html. when the blazor javascript bootstrap code runs, it detects then persistent data, and sends to the new instance via the circuit or WASM message.
this is why the persist data should be small. it is part of the initial render download, and in the case of server blazor must be sent back to the server.