Сериализация XML Объекта, Содержащего недопустимые символы

Не уверенный, почему любой когда-либо хотел бы использовать Nullable< bool> все же.:-)

Правда, Ложь, FileNotFound?

5
задан John Saunders 22 July 2009 в 17:31
поделиться

3 ответа

На этапе сериализации действительно должен был произойти сбой, потому что 0x14 - недопустимое значение для XML . Невозможно избежать его, даже с помощью & # x14 , поскольку он исключен как допустимый символ из модели XML. Я действительно удивлен, что сериализатор пропускает это, поскольку он делает сериализатор несовместимым.

Можно ли удалить недопустимые символы из строки перед ее сериализацией? С какой целью у вас есть 0x14 в HTML?

Или, возможно, вы пишете в одной кодировке, а читаете в другой?

2
ответ дан 14 December 2019 в 01:13
поделиться

Вам действительно следует опубликовать код класса, который вы пытаетесь сериализовать и десериализовать. А пока я сделаю предположение.

Скорее всего, недопустимый символ находится в поле или свойстве типа 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
1
ответ дан 14 December 2019 в 01:13
поделиться

Я бы попросил .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 :)

0
ответ дан 14 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: