Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

C# - Забавная штука со штатным JSON сериализатором

629  
alex445 коренной житель24.01.23 18:30
NEW 24.01.23 18:30 
Последний раз изменено 24.01.23 18:30 (alex445)

Берём составной тип, но в принципе ничего сложного. Только есть свойство-коллекция с типом-интерфейсом - скажем, IEnumerable<int>. Далее сериализуем в джейсон, затем десериализуем, и снова сериализуем, но уже в XML - получаем ошибку


ошибка: System.Text.Json.JsonElement was not expected. Use XmlInclude or SoapInclude attribute to specify types that are not known statically.


Откуда этот JsonElement взялся? Десериализатор там что-то своё добавляет?


Кто не понял:


object - JsonSerializer.Serialize - JSON string - JsonSerializer.Deserialize - object - XmlSerializer.Serialize - ошибка


Похоже, ошибка именно в десериализации через встроенный в Дотнет JsonSerializer, т.к. если эту же джейсонку скормить сериализатору от NewtonSoft, то он такой херни не делает. Т.е. после его десериализации, дотнетовский XML-сериалайзер нормально сериализует объект.


object - JsonSerializer.Serialize - JSON string - (NewtonSoft) JsonConvert.DeserializeObject - object - XmlSerializer.Serialize - успех

object - JsonConvert.SerializeObject - JSON string - JsonConvert.DeserializeObject - object - XmlSerializer.Serialize - успех


PS. Кстати, у МС у самой неконсистентность в названиях - пространства имён Xml и IO. В одном случае оббревиатура через маленькие буквы, в другом - через большие.

#1 
Срыв покровов патриот24.01.23 19:09
NEW 24.01.23 19:09 
в ответ alex445 24.01.23 18:30, Последний раз изменено 24.01.23 19:10 (Срыв покровов)

Ты объект, вышедший из JsonSerializer.Deserialize

Смотрел? Может там каша какая?


Исходный объект же сериализуется в хмл?

#2 
alex445 коренной житель24.01.23 19:31
NEW 24.01.23 19:31 
в ответ Срыв покровов 24.01.23 19:09, Последний раз изменено 24.01.23 19:32 (alex445)

Чёт херня какая-то. Щас попробовал - со штатным получилось. Коллекция правда пустая (XML-сериализатор штатный интерфейсы не сериализует), но уже без ошибки.


Я там правда код немного поменял, но уже не верну старую версию.


Ладно, значит я ступил чего-то, недосмотрел.


ПС. А имена пространств имён всё равно неконсистентны.

#3 
AlexNek патриот24.01.23 20:13
AlexNek
NEW 24.01.23 20:13 
в ответ alex445 24.01.23 18:30
через встроенный в Дотнет JsonSerializer

попробуй с Dictionary - будет море удовольствия.

Желательно брать NewtonSoft и не мучаться.

#4 
alex445 коренной житель24.01.23 21:15
NEW 24.01.23 21:15 
в ответ AlexNek 24.01.23 20:13

Я своим заказчикам тоже сказал - желательно брать JSON-сериалайзер, Radzen и Entity Framework - получите из коробки быстрый и удобный UI, запросы к БД и сериализацию этих запросов. Нет, сказали юзать XML, свою старую ORM-клячу и корявые кастомные модели для UI-компонентов. Такое ощущение, что народ не хочет быстро и качественно, а хочет до пенсии поддерживать свои костыли.

#5 
Срыв покровов патриот24.01.23 21:17
NEW 24.01.23 21:17 
в ответ alex445 24.01.23 21:15

а что такое сериализация запросов?

#6 
alex445 коренной житель24.01.23 21:41
NEW 24.01.23 21:41 
в ответ Срыв покровов 24.01.23 21:17, Последний раз изменено 24.01.23 21:56 (alex445)

Есть таблица с настраиваемыми фильтрами - типа визуальный конструктор запросов. Для обычных пользователей, не программистов. Надо эту визуальщину преобразовывать в запрос к БД, а также сохранять в БД сам запрос и восстанавливать настройки этого запроса в визуальном конструкторе. Т.е. у конструктора есть некий объект, хранящий все фильтры - вот этот объект и надо превращать в SQL и сериализовать в строку для хранения в БД. По идее, можно SQL обратно распарсить в такой объект, но они решили для хранения в БД использовать XML. Поэтому этот объект настроек фильтров должен и в SQL, и в XML (и обратно) конвертироваться.


Штука ещё в том, что UI может поменяться, а сохранённые настройки в БД останутся от старого. Поэтому нужен промежуточный объект, который не будет меняться в зависимости от UI. Что-то типа такого


UI filter settings - DTO object - DB query


Если бы они юзали стандартный EF, то проблемы бы не было - в каждой уважающей себя UI-либе есть его поддержка из коробки, ничего писать не надо - т.е. промежуточный узел с DTO не нужен, все конвертации из UI в запросы проходят автоматически, сами запросы сериализуются в JSON их можно сохранять и снова загружать в UI, восстанавливая все настройки фильтров. Но у них своя ORM на датасетах, при этом хреново сериализуемая (например, у кучи типов нет сеттеров, нужных для сериализации в XML, плюс кода какие-то немереные килотонны - задолбаешься обвешивать атрибутами сериализации и потом полученный гигансткий объект сохранять в БД). Там либо переписывать всё, либо писать DTO. А они ещё усугубляют, заставляя юзать XML, а не JSON (который тоже любой нормальной либой из коробки поддерживается). Я выбрал DTO с минимальными настройками длс запроса - без лишнего мусора их самописной ORM. В результате я должен писать конвертеры ORM - DTO и UI - DTO, а сам DTO делать сериализуемым в XML, чтобы его потом в БД сохранить.

#7 
AlexNek патриот24.01.23 22:00
AlexNek
NEW 24.01.23 22:00 
в ответ alex445 24.01.23 21:15
Radzen

Не всё там пока получается. Tooltip не запустился, пытаются подгрузить либу с другим именем.

WaitCursor там тоже не нашел


что народ не хочет быстро и качественно

народ не хочет ничего менять. Будет ли новое лучше никто не знает.

А когда допустим, сделаешь, скажут а вот так еще не работает. Так не говорили же, что так должно работать - а у нас всегда так работало надо было знать...

#8 
alex445 коренной житель24.01.23 23:12
NEW 24.01.23 23:12 
в ответ AlexNek 24.01.23 22:00
А когда допустим, сделаешь, скажут а вот так еще не работает. Так не говорили же, что так должно работать - а у нас всегда так работало надо было знать...

Вот один в один.

#9 
AlexNek патриот25.01.23 18:02
AlexNek
NEW 25.01.23 18:02 
в ответ alex445 24.01.23 23:12

Ну теперь хоть немного понятно отчего народ не хочет нового?


Да, возможно, через какое то время оно оправдается / а может и нет/

А тут уже всё протестено за х лет вдоль и поперек. Работает на ура. Нужно только это новое поле и пара кнопочек.

Смотреть нужно не со стороны разработчика.

#10 
alex445 коренной житель25.01.23 21:02
NEW 25.01.23 21:02 
в ответ AlexNek 25.01.23 18:02, Последний раз изменено 25.01.23 21:04 (alex445)

Всё может быть, но своя костыльная ORM всяко должна быть заменена на хотя бы EF. Это не должно обсуждаться. Нет - будем развивать и доводить до ума нашу старую самописную ORM 15-летнего возраста. У старой самописной ORM сериализация не поддерживается - мути-колдуй, расставляй атрибуты по куче классов, обвешивай костылями. У EF же всё сериализуется со свистом из коробки (благодаря в том числе Dynamic LINQ).

#11 
Murr патриот26.01.23 10:06
Murr
NEW 26.01.23 10:06 
в ответ alex445 25.01.23 21:02

своя костыльная ORM всяко должна быть заменена на хотя бы EF

-----

Перед тем как изрекать глупости стоит ознакомится с возможностями технологии.

В данном случае тебе предлагается сделать простой тестик - написать что-то маленькое с использованием EF.

С чем тебе надо будет заставить его работать тебе будет сообщено после релиза.


#12 
AlexNek патриот26.01.23 19:33
AlexNek
NEW 26.01.23 19:33 
в ответ alex445 25.01.23 21:02
Это не должно обсуждаться

Всё должно обсуждаться. Хотя бы простой вопрос - сколько нужно тебе времени на замену и отладку старой ORM?

И как будет гарантировано, что новая система будет работать точно также как старая? И не забывай, что могут быть проекты использующие старую ОРМ о которых лично ты никогда не слышал.

#13 
alex445 коренной житель26.01.23 20:41
NEW 26.01.23 20:41 
в ответ AlexNek 26.01.23 19:33
Всё должно обсуждаться

Только это и позволяет всяким Васям продолжать лохматить бабушек. А так бы давно переминались на морозе.

)))

#14 
AlexNek патриот26.01.23 21:49
AlexNek
26.01.23 21:49 
в ответ alex445 26.01.23 20:41

Ну давай, ты в команде будешь делать всё что хочешь, ни с кем ничего не обсуждая....

#15 
Maestro72 завсегдатай14.02.23 09:30
NEW 14.02.23 09:30 
в ответ AlexNek 26.01.23 21:49
Ну давай, ты в команде будешь делать всё что хочешь, ни с кем ничего не обсуждая....


up

#16