Ситуація: Коли я десеріалізую 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.