microsoft/garnet · error · RedisSerializationException
Unable to deserialize RedisOptions object. Line {lineCount}
Error message
Unable to deserialize RedisOptions object. Line {lineCount} not in expected format (keyword argument1 argument2 ... argumentN). What it means
Thrown by RedisConfigSerializer.Deserialize when a non-comment, non-blank line in a Redis-format config file has no space character. Every directive in a Redis .conf file must follow 'keyword argument1 argument2 ... argumentN'. A line with only a keyword and no arguments (no space) is rejected because the parser cannot extract a value portion.
Source
Thrown at libs/host/Configuration/Redis/RedisConfigSerializer.cs:77
/// <exception cref="RedisSerializationException"></exception>
public static RedisOptions Deserialize(StreamReader reader, ILogger logger)
{
var options = new RedisOptions();
int lineCount = 0;
string line;
while ((line = reader.ReadLine()) != null)
{
lineCount++;
// Ignore whitespaces and comments
if (string.IsNullOrWhiteSpace(line) || line.TrimStart().StartsWith('#'))
continue;
// Expected line format: keyword argument1 argument2 ... argumentN
var sepIdx = line.IndexOf(' ');
if (sepIdx == -1)
throw new RedisSerializationException(
$"Unable to deserialize {nameof(RedisOptions)} object. Line {lineCount} not in expected format (keyword argument1 argument2 ... argumentN).");
// Ignore key when no matching property found
var key = line.Substring(0, sepIdx);
if (!KeyToProperty.Value.ContainsKey(key))
{
logger?.LogWarning("Redis configuration option not supported: {key}.", key);
continue;
}
var value = line.Substring(sepIdx + 1);
// Get matching property & the underlying option type (T in Option<T>)
var prop = KeyToProperty.Value[key];
var optType = prop.PropertyType.GenericTypeArguments.First();
// Try to deserialize the value
if (!TryChangeType(value, typeof(string), optType, out var newVal))View on GitHub (pinned to 951b0fc683)
Solutions
- Inspect the line number reported in the error message and add the missing argument(s) after the keyword.
- If the directive genuinely takes no arguments, add a dummy value or remove the line if it's not needed.
- Validate the config file format: each non-comment line must contain at least one space separating the keyword from its value.
Example fix
// before (line 3 of config file): // save // after: // save 3600 1 300 100 60 10000
Defensive patterns
Strategy: validation
Validate before calling
foreach (var (line, num) in File.ReadLines(configPath).Select((l, i) => (l, i + 1)))
{
var trimmed = line.TrimStart();
if (string.IsNullOrWhiteSpace(trimmed) || trimmed.StartsWith('#')) continue;
if (!line.Contains(' '))
throw new FormatException($"Line {num}: directive '{trimmed}' has no arguments (expected 'keyword arg1 ...')");
} Type guard
static bool IsValidConfigLine(string line)
{
var t = line.TrimStart();
if (string.IsNullOrWhiteSpace(t) || t.StartsWith('#')) return true;
return line.Contains(' ');
} Try / catch
try
{
var redisOpts = RedisConfigSerializer.Deserialize(reader, logger);
}
catch (RedisSerializationException ex) when (ex.Message.Contains("not in expected format"))
{
logger.LogError("Redis config file has a malformed line: {msg}", ex.Message);
throw;
} Prevention
- Every directive line in a Redis config file must have at least one space after the keyword.
- Validate config files with a linting tool before deploying.
- Use comments starting with '#' for notes instead of bare keywords.
When it happens
Trigger: Loading a redis.conf-style file where a directive line is a single bare token with no space separator (e.g., a line containing only 'save' with no arguments). The code at line 75-76 uses IndexOf(' '); -1 means no space was found.
Common situations: Hand-edited Redis config files where a user accidentally deleted the argument portion; copy-paste from documentation that truncated the example; config generation tool that emitted keyword-only lines for boolean directives.
Related errors
- Unable to deserialize RedisOptions object. Unable to convert
- Unable to deserialize RedisOptions object. Unable to convert
- Expected start of JSON object.
- Unable to find property in {typeof(Options)} named {redisOpt
- Unable to convert property {prop.Name} in {typeof(RedisOptio
AI-assisted analysis of microsoft/garnet@951b0fc683 (2026-08-13).
Data as JSON: /api/errors/df2b4def3a461967.
Report an issue: GitHub.