External types
Sometimes you need to serialize or deserialize a type you don't control or can't modify. In these cases, Serde uses a "proxy type" to stand-in for the external type. To create a proxy type, simply create a new class and add the attribute [GenerateSerde(ForType = typeof(ExternalType)]
. Serde will automatically use the public properties and fields on the external type if the proxy type is empty. Here's a simple example that assumes there's an external Response
record that you can't modify.
using System;
using Serde;
using Serde.Json;
namespace ExternalTypesSample;
// Pretend that Response is an external type that we can't modify directly
public record Response(string ResponseType, string Body);
// Proxy for the Response type.
// We use the [GenerateSerde] attribute with the `ForType` parameter to control
// generation for the proxy type. Since the ResponseProxy type is empty, Serde
// will assume that we want to automatically use all the public properties and
// fields of the Response type, with no further customization.
[GenerateSerde(ForType = typeof(Response))]
partial class ResponseProxy;
public class Sample
{
public static void Run()
{
var resp = new Response(ResponseType: "success", Body: "hello, world");
Console.WriteLine($"Original version: {resp}");
// Serialize the Response to a JSON string
// In addition to the Response type, we also have to pass in the proxy type
var json = JsonSerializer.Serialize<Response, ResponseProxy>(resp);
Console.WriteLine($"Serialized version: {json}");
// Deserialize the JSON string back to a Response object
var deResp = JsonSerializer.Deserialize<Response, ResponseProxy>(json);
Utils.AssertEq(resp, deResp);
Console.WriteLine($"Deserialized version: {deResp}");
}
}