|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Доброго времени суток Предполагаю для сохранения настроек использовать XML-файлы. Классы настроек могут быть достаточно сложными (с коллекциями и коллекциями в коллекциях, например), причем компонент приложения, который будет заниматься их сериализацией/десериализацией, заранее об этих классах не знает. Имеется ли готовое решение для подобных случаев? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 01:00 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Стандартный XmlSerializer: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
Результат: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Для более тонкой настройки сериализации используются атрибуты . Только есть пара нюансов: 1. В случае вот такого варианта: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
конструктор XmlSerializer'а выкинет исключение, у которого внутри будет Код: plaintext
2. XML-сериализация очень тормозная. Я лично вместо нее использую JSON-сериализацию (в т.ч. для настроек) c помощью JSON.Net - получается заметно быстрее XML. Хотя и здесь есть свои нюансы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 06:38 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, большое Вам спасибо, буду пробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 15:17 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
JohnSparrow, есть еще геморои с наследованием классов ) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 15:59 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Попробовал Json.NET. Сериализируется все, вроде бы, отлично, но с десериализацией проблемы. Либо нужно указывать тип, в экземпляр которого будут десериализироваться данные ( JsonConvert.DeserializeObject<Type>(json text) ), либо ( JsonConvert.DeserializeObject(json text) )в качестве результата будет получен объект типа Newtonsoft.Json.Linq.JObject, доступ к свойствам которого осуществляется через Newtonsoft.Json.Linq.JObject.Properties(). В общем, хотелось бы, чтобы результат десериализации можно было преобразовывать в объект нужного типа. Это возможно? Вот пример написанного выше: ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 17:59 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
JohnSparrow, авторЛибо нужно указывать тип, в экземпляр которого будут десериализироваться данныеа в стандартном XML сериализаторе разве не нужно указывать тип в который будет xml десериализовываться? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 18:04 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Нужно. И этим он мне не нравится. Есть один вариант - http://www.codeproject.com/Articles/15646/A-Deep-XmlSerializer-Supporting-Complex-Classes-En но у него свои проблемы: не сериализуется Guid, а также Dictionary<string, object>; наверняка есть еще нюансы. Конечно, можно присобачить костыли, но я надеялся, что есть подобный, но более развитой и работоспособный вариант. Кроме того, желательно свести до минимума адаптацию структуры сериализуемого класса под конкретный сериализатор . Например, Json.NET для определения свойств, которые не нужно сериализовать, предлагает создавать спецметоды, имена которые зависят от имен соотв. свойств (см. документацию ). Получается, что класс с данными затачивается под конкретное хранилище данных, а это плохо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 18:40 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
про Json.NET правильная ссылка: http://james.newtonking.com/json/help/html/ConditionalProperties.htm ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 18:41 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
JohnSparrow, Вы как то странно себя мучаете. по дефолту Json формат не привязан ни к какому типу net. ибо пользователем могут быть клиенты и на JS ,php, Java ..ets, равно и серилизатор vcf. Но везде оставлены плющки net to net, в вашем случе надо было поглубже ознакомится с библиотекой тынц или http://msdn.microsoft.com/ru-ru/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 18:44 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Где-то в степи, Вас не затруднит уточнить первую ссылку (ака "тынц")? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 19:27 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
JohnSparrow, пользуйтесь не JsonConvert, а JsonSerializer - у его метода Deserialize есть перегрузки с указанием типа: http://james.newtonking.com/json/help/html/Overload_Newtonsoft_Json_JsonSerializer_Deserialize.htm либо используете генерик-перегрузку - тогда будет возвращаться уже готовый к употреблению тип, либо перегрузку с указанием Type - ну, тогда надо будет скастить результат Deserialize к нужному типу. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 19:29 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
JohnSparrow, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 19:30 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 19:32 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
JohnSparrow, я не пойму, вам надо было вызвать перегрузку дженерика, или у Вас еще какие то проблемы с типом возникают? Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 19:59 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Уважаемые коллеги, возможно, я не совсем верно изложил вопрос. Ниже приведен скелет приложения с описанной проблемой. Итак, основная сборка приложения - App.exe, класс приложения - App. Все компоненты приложения представлены в классе App интерфейсами, определенными в Base.dll. В нашем приложении имеется два компонента - извещатели об ошибках и критических событиях. Реализации интерфейса извещателя приведены в сборках SmsMessaging.dll и EmailMessaging.dll. Каждый компонент имеет свои настройки, которые надо сохранять (App.Finalize) и загружать (App.Initialize). В прмере настройки простые, в реальности они могут быть очень сложными, причем исполняющей программе конкретные классы настроек (как и самих компонентов) неизвестны. Основная задача - найти готовое решение, которое сможет сохранять в файл (желательно - текстовый, с возможностью редактирования) настройки разных компонентов и загружать их из файла, автоматически создавая классы соотв. настроек. В приложении эти функции выполняет объект App.SettingsStorage. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124.
Т.е. в том, чтобы десериализовать объект, зная его тип, проблем нет. Проблема в том, чтобы десериализовать объект неизвестного типа, создав его в процессе десериализации. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 22:56 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
JohnSparrowПроблема в том, чтобы десериализовать объект неизвестного типа, создав его в процессе десериализации. сделать можно, но что с неизвестным типом потом делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2014, 23:19 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
JohnSparrow, вообще то решается просто нативными путями Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
но у конветера нет метода CanConvertToType, и он отдаст объект типа к которому приводится, если да же граф не подходит.( а не null) тут могут даже быть некоторые коллизии при совпадении имен переменных. как бы что в голову пришло: как вы заметили я создал в типе ( сериализуемом) переменную public string Typename { get; set; } и уже после серализации вытаскиваю значения из словаря, и наверняка привожу тип к которому нужно. наверное не очень правильно, но для служебного пользования можно. Код: c# 1. 2.
Надо порыться и посмотреть в вашей библиотеке может такое возможно через атрибуты только для net... но вообще что то плохой архитектурой попахивает,если тип десериализации не известен, и приходится рыскать.. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 02:06 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Где-то в степино вообще что то плохой архитектурой попахивает +1 И изобретением велосипеда. Существует стандартная система настроек - ей и нужно пользоваться. Для сериализации в JSON нужно написать реализацию TypeConverter, сериализующую объект в стринг, и пометить атрибутом TypeConverter с указанием своего конвертера свой тип (при этом в случае newtonsoft'овского JSON.Net TypeConverter обязательно должен быть унаследован он ComponentConverter, иначе StackOverflowException). После этого объекты будут спокойно сериализоваться-десериализоваться в обычный файл настроек, а все вызовы сериализации-десериализации будут делаться стандартной системой настроек через вышеупомянутый TypeConverter. Ну, а если у вас своя система хранения настроек - реализуйте свой SettingsProvider, в этом нет ничего сложного. Потом этот провайдер указать в свойствах каждой настройки, либо вынести все настройки, сериализуемые особенным образом, в отдельный файл а-ля MyCustomSerializedSettings.settings, и Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 03:45 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, я об этом знал, когда писал о CanConvertToType, посчитал что что так будет спокойней и доходчивей. это не велосипед есть сериализаторы которые в служебном поле тащат название типа, а в итоге имеем банальное приведение типа на выходе, если не изменяет память netdatacontractserializer ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 10:41 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Где-то в степи, про велосипед относилось к реализации ТСом своего некоего SettingsStorage, т.е. разрабатываемой с нуля системой хранения настроек. А это, повторюсь еще раз, не нужно, достаточно сделать свою реализацию SettingsProvider, и далее пользоваться стандартным механизмом. Поскольку он и сам прописывает тип, в который производится десериализация, и сам сериализует-десериализует, и плюс ко всему - ввиду использования кодогенерации позволяет работать в коде с вполне типизированными настройками. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 10:53 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, но тут я не знаю, в общем то я то же за SettingsProvider, тем более разграничение по пользователям не плохая вещь. но наверное чем то не подходит ( приходится клещами вытаскивать), тем более та оперирует контейнерами предположу что основы основ ему знакомы... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 11:26 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, меня в общем то очень удивила реализация метода serializer.ConvertToType(object, Type ) тип Type должен иметь конструктор по умолчания, со всей логики это полный аут. ведь приведение типа это нечто иное как финал десирализации ( заполнение объекта типа значениями из словаря графа) и причем тут открытый конструктор без параметров. с точки зрения логики это абсолютно до фонаря может быть,( что тип объекта не может иметь закрытого конструктора?) Надо отдать должное ms при десиреализации везде пользуется своей изюминкой FormatterServices.GetSafeUninitializedObject(type) или GetUninitializedObject а тут простой в лоб активатор.... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 11:44 |
|
Сериализация произвольного класса в XML
|
|||
---|---|---|---|
#18+
ИзопропилJohnSparrowПроблема в том, чтобы десериализовать объект неизвестного типа, создав его в процессе десериализации. сделать можно, но что с неизвестным типом потом делать?По всей вероятности он должен будет потом жить своей особенной жизнью. JohnSparrow, не парьтесь, меняйте архитектуру. Выделите общую для настроек часть в отдельную ветку, специфичную для конкретного случая настройку оформите как один из параметров типа CDATA в другой ветке. Туда сериализуете специфичные настройки, потом конкретный класс проверяет из настроек этот параметр, если надо десериализует (он-то знает что ему нужно ) и пользуется. Ну что-то типа такого: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 12:29 |
|
|
start [/forum/topic.php?fid=20&msg=38653995&tid=1402868]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 144ms |
0 / 0 |