{"record":{"id":"77d074b15483c570","repo":"restsharp/RestSharp","slug":"unable-to-find-a-serializer-for-dataformat","errorCode":null,"errorMessage":"Unable to find a serializer for {dataFormat}","messagePattern":"Unable to find a serializer for (.+?)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/RestSharp/Serializers/RestSerializers.cs","lineNumber":31,"sourceCode":"// limitations under the License.\n//\n\nusing System.Collections.ObjectModel;\nusing RestSharp.Extensions;\nusing RestSharp.Serializers.Xml;\n\nnamespace RestSharp.Serializers;\n\npublic class RestSerializers(Dictionary<DataFormat, SerializerRecord> records) {\n    [PublicAPI]\n    public IReadOnlyDictionary<DataFormat, SerializerRecord> Serializers { get; } = new ReadOnlyDictionary<DataFormat, SerializerRecord>(records);\n\n    public RestSerializers(SerializerConfig config) : this(config.Serializers) { }\n\n    public IRestSerializer GetSerializer(DataFormat dataFormat)\n        => Serializers.TryGetValue(dataFormat, out var value)\n            ? value.GetSerializer()\n            : throw new InvalidOperationException($\"Unable to find a serializer for {dataFormat}\");\n\n    internal string[] GetAcceptedContentTypes() => Serializers.SelectMany(x => x.Value.AcceptedContentTypes).Distinct().ToArray();\n\n    internal async ValueTask<RestResponse<T>> Deserialize<T>(RestRequest request, RestResponse raw, ReadOnlyRestClientOptions options, CancellationToken cancellationToken) {\n        var response = RestResponse<T>.FromResponse(raw);\n\n        try {\n            await OnBeforeDeserialization(raw, cancellationToken).ConfigureAwait(false);\n#pragma warning disable CS0618 // Type or member is obsolete\n            request.OnBeforeDeserialization?.Invoke(raw);\n#pragma warning restore CS0618 // Type or member is obsolete\n            response.Data = DeserializeContent<T>(raw);\n        }\n        catch (Exception ex) {\n            if (options.ThrowOnAnyError) throw;\n\n            if (options.FailOnDeserializationError || options.ThrowOnDeserializationError) response.ResponseStatus = ResponseStatus.Error;\n","sourceCodeStart":13,"sourceCodeEnd":49,"githubUrl":"https://github.com/restsharp/RestSharp/blob/6a5082169257438cd085f822f050d93256a8e499/src/RestSharp/Serializers/RestSerializers.cs#L13-L49","documentation":"RestSerializers.GetSerializer throws InvalidOperationException when no serializer is registered for the requested DataFormat. This happens at request-build time (serializing a body) and at deserialization time when looking up a handler by DataFormat. The default configuration registers Json, Xml, and None, so requesting Csv or a custom format without registration triggers it.","triggerScenarios":"Adding a body with a DataFormat (e.g. DataFormat.Csv or a custom value) that was not registered via ConfigureSerialization; clearing/replacing the default SerializerConfig so only some formats remain; deserializing a response whose detected format maps to an unregistered DataFormat.","commonSituations":"Using the CsvHelper serializer package but forgetting to register it via UseCsvHelper(); providing a custom DataFormat enum value; upgrading and inadvertently overriding the default serializer config.","solutions":["Register a serializer for the DataFormat via RestClientOptions/ConfigureSerialization (e.g. config.UseCsvHelper(), config.UseXmlSerializer(), config.UseNewtonsoftJson()).","If using a custom DataFormat, add an IRestSerializer for it in the SerializerConfig.Serializers dictionary.","Verify the body's DataFormat matches a registered serializer before calling ExecuteAsync.","When only JSON is needed, ensure DataFormat.Json stays registered (do not clear the default config)."],"exampleFix":"// before\nvar client = new RestClient(options, _ => { }, _ => { }); // csv not registered\nrequest.AddBody(obj, DataFormat.Csv); // -> GetSerializer throws\n\n// after\nvar client = new RestClient(options, configureSerialization: cfg => cfg.UseCsvHelper());\nrequest.AddBody(obj, DataFormat.Csv);","handlingStrategy":"validation","validationCode":"if (!client.Serializers.Serializers.ContainsKey(requiredFormat))\n    throw new InvalidOperationException($\"No serializer registered for {requiredFormat}; register one via ConfigureSerialization\");","typeGuard":"static bool IsFormatRegistered(RestClient client, DataFormat format) => client.Serializers.Serializers.ContainsKey(format);","tryCatchPattern":"try {\n    await client.ExecuteAsync<T>(request);\n}\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"Unable to find a serializer\")) {\n    // register the missing serializer and retry\n}","preventionTips":["Register every DataFormat you use via ConfigureSerialization (UseCsvHelper/UseXmlSerializer/UseNewtonsoftJson).","Do not clear the default SerializerConfig.Serializers dictionary without re-adding needed formats.","Unit-test custom DataFormats against the registered serializer set."],"tags":["serialization","configuration","dataformat","invalid-operation"],"backgroundTag":null,"analyzedSha":"6a5082169257438cd085f822f050d93256a8e499","analyzedAt":"2026-08-13T20:38:25.807Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}