ServiceStack - массив внутри словаря, десериализованный в строку - PullRequest
1 голос
/ 06 марта 2019

У меня есть DT0, у которого есть следующее свойство

public Dictionary<string,object> Parameters {get;set;}

Теперь у меня есть проблема в том, что если я добавлю массив к Parameters, он будет десериализован в строку.Есть ли способ десериализации его должным образом.

У меня есть один вариант - иметь строго типизированное свойство Parameters, к сожалению, оно не будет работать в моем случае, так как я стараюсь сделать его настолько динамичным, каквозможно.

1 Ответ

3 голосов
/ 06 марта 2019

Попытка сделать ваши DTO как можно более «динамичными» - это плохой дизайн сервиса, из-за которого в вашем сервисном контракте есть дыра, которая допускает неизвестные типы, которые не будут работать в большинстве сериализаторов, потерпят неудачу в большинстве не .NET языков , не могут быть задокументированы в службах метаданных и подвержены дополнительным ограничениям безопасности .

При этом ServiceStack поддерживает принятие произвольных объектов JavaScript или JSON , если выиспользуйте свойство с типом object:

[Route("/callback")]
public class Callback : IReturn<CallbackResponse>
{
    public object Payload { get; set; }
}

Но я также только что расширил его для поддержки Dictionary<string,object> и List<object> в этого коммита , где он теперь будет использоватьдинамический сериализатор JSON для анализа свойств объектов и коллекций объектов.Это изменение доступно в v5.4.1.

Но оно все равно должно использоваться экономно по указанным выше причинам, поскольку оно делает ваши службы менее совместимыми и более подверженными проблемам времени выполнения.

Рассмотрите возможность использования stringкогда значение свойства неизвестно, и ваша служба проанализирует его в ожидаемом типе, например:

Dictionary<string,string> Properties { get; set; }

, который является более функционально совместимым и не имеет проблем, которые позволяют неизвестные object.

...