Не уверенный, почему любой когда-либо хотел бы использовать Nullable< bool> все же.:-)
Правда, Ложь, FileNotFound?
На этапе сериализации действительно должен был произойти сбой, потому что 0x14
- недопустимое значение для XML . Невозможно избежать его, даже с помощью & # x14
, поскольку он исключен как допустимый символ из модели XML. Я действительно удивлен, что сериализатор пропускает это, поскольку он делает сериализатор несовместимым.
Можно ли удалить недопустимые символы из строки перед ее сериализацией? С какой целью у вас есть 0x14
в HTML?
Или, возможно, вы пишете в одной кодировке, а читаете в другой?
Вам действительно следует опубликовать код класса, который вы пытаетесь сериализовать и десериализовать. А пока я сделаю предположение.
Скорее всего, недопустимый символ находится в поле или свойстве типа string
. Вам нужно будет сериализовать это как массив байтов, предполагая, что вы вообще не можете избежать присутствия этого символа:
[XmlRoot("root")]
public class HasBase64Content
{
internal HasBase64Content()
{
}
[XmlIgnore]
public string Content { get; set; }
[XmlElement]
public byte[] Base64Content
{
get
{
return System.Text.Encoding.UTF8.GetBytes(Content);
}
set
{
if (value == null)
{
Content = null;
return;
}
Content = System.Text.Encoding.UTF8.GetString(value);
}
}
}
Это создает XML, подобный следующему:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Base64Content>AAECAwQFFA==</Base64Content>
</root>
Я вижу, вы, вероятно, предпочтете VB.NET:
''# Prettify doesn't like attributes as the first item in a VB code block, so this comment is here so that it looks right on StackOverflow.
<XmlRoot("root")> _
Public Class HasBase64Content
Private _content As String
<XmlIgnore()> _
Public Property Content() As String
Get
Return _content
End Get
Set(ByVal value As String)
_content = value
End Set
End Property
<XmlElement()> _
Public Property Base64Content() As Byte()
Get
Return System.Text.Encoding.UTF8.GetBytes(Content)
End Get
Set(ByVal value As Byte())
If Value Is Nothing Then
Content = Nothing
Return
End If
Content = System.Text.Encoding.UTF8.GetString(Value)
End Set
End Property
End Class
Я бы попросил .NET справиться с этим, но вы также можете взглянуть на класс XmlSerializer и XmlReaderSettings (см. Образец универсального метода ниже):
public static T Deserialize<T>(string xml)
{
var xmlReaderSettings = new XmlReaderSettings()
{
ConformanceLevel = ConformanceLevel.Fragment,
ValidationType = ValidationType.None
};
XmlReader xmlReader = XmlTextReader.Create(new StringReader(xml), xmlReaderSettings);
XmlSerializer xs = new XmlSerializer(typeof(T), "");
return (T)xs.Deserialize(xmlReader);
}
Я бы также проверил, нет ли кодировки (Unicode, UTF8 и т. Д.) Проблемы в вашем коде. Шестнадцатеричное значение 0x14 не является символом, который можно ожидать от XML :)