Как сериализовать массив объектов со словарем внутри

Я пытаюсь сериализовать массив объектов, который содержит словарь в качестве одного из значений, и я получаю это исключение SerializationException во время выполнения:

Type 'System.Collections.Generic.Dictionary`2 ...with data contract name 'ArrayOfKeyValueOfstringanyType
is not expected. Consider using a DataContractResolver if you are using 
DataContractSerializer or add any types not known statically to the list of 
known types - for example, by using the KnownTypeAttribute attribute or by 
adding them to the list of known types passed to the serializer.

Вот как я пытаюсь выполнить задачу:

        object[] taskArgs = new object[] { 1, 2 };
        IDictionary<string, object> kwargs = new Dictionary<string, object>();
        IDictionary<string, object> embed = new Dictionary<string, object>();
        embed.Add("callbacks", null);
        embed.Add("errbacks", null);
        embed.Add("chain", null);
        embed.Add("chord", null);


        var knownTypes = new List<Type> { typeof(IDictionary<string, object>), typeof(object []), typeof(List<string>) };
        //object[] arguments = new object[] { taskArgs, "{}", "{}"  };
        object[] arguments = new object[] { taskArgs, kwargs, embed };

        MemoryStream stream1 = new MemoryStream();
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(object[]), knownTypes);
        ser.WriteObject(stream1, arguments);
        stream1.Position = 0;
        StreamReader sr = new StreamReader(stream1);
        string message = sr.ReadToEnd();

Хотя я пытался добавить typeof(IDictionary<string, object>) в knownTypesэто не сработает.

Любая помощь будет высоко ценится. Благодарю.

1 ответ

Решение

Вы должны использовать конкретный тип typeof(Dictionary<string, object>) вместо типа интерфейса typeof(IDictionary<string, object>) для известного типа:

var knownTypes = new List<Type> { typeof(Dictionary<string, object>), typeof(object[]), typeof(List<string>) };

Тип в списке известных типов во многом совпадает с точным типом (возвращаемым GetType()) объекта неизвестного типа для вступления в силу. Сопоставление с типом базового класса или реализованным типом интерфейса недостаточно, и в любом случае сериализаторы контракта данных не поддерживают интерфейсы сериализации.

Другие вопросы по тегам