/ / XML Десериалізація повернень каретки спричиняє недруковані символи - .net, winforms, xml-serialization

XML десеріалізація повернення каретки викликає неприкривані символи - .net, winforms, xml-serialization

Ситуація: Коли я десеріалізую XML, що містить повернення каретки, символи відображаються як "коробки" символів, що не друкуються, а не як повернення каретки.

Передумови: Введення користувача, зібране за допомогою багаторядкового текстового полямістить повернення каретки в тексті. Я зберігаю ці текстові дані в XML за допомогою серіалізатора .NET XML (фрагмент нижче). Коли я пізніше десеріалізую дані XML і прив'яжу їх назад до багаторядкового текстового поля, символи повернення каретки відображаються як "коробки", що не друкуються.

Я знаю, що Windows використовує каретку повернення + подачу рядка, щоб вказати кінець рядка. Я думаю, що серіалізація XML може міняти дані (можливо, позбавляє повернення каретки?).

Питання: Будь-які ідеї, як я можу зробити десеріалізований повернення каретки належним чином?

Заздалегідь дякую, -Ред

Фрагмент серіалізації

Public Sub SaveApplicationOptions(ByVal AppOptions As ApplicationOptions) Implements IApplicationOptionsRepository.SaveApplicationOptions
Dim serializer As New XmlSerializer(GetType(ApplicationOptions))
Dim ApplicationOptionsFilename As String = ConfigurationManager.AppSettings("ApplicationOptionsXML")
Dim sw As New StreamWriter(ApplicationOptionsFilename)
serializer.Serialize(sw, AppOptions)
sw.Close()
sw.Dispose()
End Sub

Відповіді:

2 для відповіді № 1

Інший підхід полягає у використанні XmlAttribute (), як уже згадувалося тут. Наприклад:

Imports System.Xml.Serialization

Public Class ApplicationOptions

Private _someText As String = String.Empty

<XmlAttribute()> _
Public Property SomeText() As String
Get
Return _someText
End Get
Set(ByVal value As String)
_someText = value
End Set
End Property

End Class

Я щойно спробував його на зразку програми, і символи рядкової подачі не замінювались під час десеріалізації.


2 для відповіді № 2

Проблема може полягати в двох символах, які використовуються для нових рядків - перенесення характер і повернення каретки характер. Windows, UNIX і Mac використовують їх по-різному. Аналізатори XML змінюють нові рядки на один символ подачі рядків. Це стосується всіх систем однорідності.

У вашому десеріалізованому тексті коди подачі рядків, швидше за все, виглядатимуть як "n".

Одним із підходів було б замінити "n" на NewLine. Наприклад,

DeserializedText = DeserializedText.Replace("n", Environment.NewLine);

Тоді лінійні канали відображатимуться як "rn", що буде виглядати розумно в текстовому полі WinForms.