Использование StringWriter для сериализации XML

Поскольку Gary сказал в комментариях:

было бы хорошо, если Бегуну Единицы можно было бы сказать идти вперед и заказать им именем класса. Хм, возможно, я должен изучить исходный код...

я действительно смотрел, но нет никакой подсказки функциональности для сортировки этих имен. Я предложил бы запрос на изменение плагину JUnit, но я не думаю, что существует партия людей, использующих эту вещь, таким образом: сделай сам.

я хотел бы видеть решение, если Вы изменяете сменный код.

94
задан Solomon Rutzky 4 December 2018 в 23:30
поделиться

3 ответа

Прежде всего, остерегайтесь поиска старых примеров. Вы нашли тот, который использует XmlTextWriter , который не рекомендуется в .NET 2.0. Вместо этого следует использовать XmlWriter.Create .

Вот пример сериализации объекта в столбец XML:

public void SerializeToXmlColumn(object obj)
{
    using (var outputStream = new MemoryStream())
    {
        using (var writer = XmlWriter.Create(outputStream))
        {
            var serializer = new XmlSerializer(obj.GetType());
            serializer.Serialize(writer, obj);
        }

        outputStream.Position = 0;
        using (var conn = new SqlConnection(Settings.Default.ConnectionString))
        {
            conn.Open();

            const string INSERT_COMMAND = @"INSERT INTO XmlStore (Data) VALUES (@Data)";
            using (var cmd = new SqlCommand(INSERT_COMMAND, conn))
            {
                using (var reader = XmlReader.Create(outputStream))
                {
                    var xml = new SqlXml(reader);

                    cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("@Data", xml);
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
}
19
ответ дан 24 November 2019 в 05:55
поделиться

Одна проблема с StringWriter заключается в том, что по умолчанию он не позволяет вам устанавливать кодировку, которую он рекламирует - так что вы можете получить XML-документ, рекламирующий его кодировку как UTF-16, что означает, что вам нужно закодировать его как UTF-16, если вы записываете его в файл. У меня есть небольшой класс, который может помочь с этим:

public sealed class StringWriterWithEncoding : StringWriter
{
    public override Encoding Encoding { get; }

    public StringWriterWithEncoding (Encoding encoding)
    {
        Encoding = encoding;
    }    
}

Или, если вам нужен только UTF-8 (это все, что мне часто нужно):

public sealed class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding => Encoding.UTF8;
}

Что касается того, почему вы не можете сохранить свой XML в базе данных - вы ' Если вы хотите, чтобы мы смогли диагностировать / исправить это, вам нужно будет сообщить нам более подробную информацию о том, что произошло, когда вы попытались это сделать.

t позволяет вам установить кодировку, которую он объявляет - так что вы можете получить XML-документ, рекламирующий его кодировку как UTF-16, что означает, что вам нужно закодировать его как UTF-16, если вы записываете его в файл. У меня есть небольшой класс, который может помочь с этим:

public sealed class StringWriterWithEncoding : StringWriter
{
    public override Encoding Encoding { get; }

    public StringWriterWithEncoding (Encoding encoding)
    {
        Encoding = encoding;
    }    
}

Или, если вам нужен только UTF-8 (это все, что мне часто нужно):

public sealed class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding => Encoding.UTF8;
}

Что касается того, почему вы не можете сохранить свой XML в базе данных - вы ' Если вы хотите, чтобы мы смогли диагностировать / исправить это, вам нужно будет сообщить нам более подробную информацию о том, что произошло, когда вы попытались это сделать.

t позволяет вам установить кодировку, которую он объявляет - так что вы можете получить XML-документ, рекламирующий его кодировку как UTF-16, что означает, что вам нужно закодировать его как UTF-16, если вы записываете его в файл. У меня есть небольшой класс, который может помочь с этим:

public sealed class StringWriterWithEncoding : StringWriter
{
    public override Encoding Encoding { get; }

    public StringWriterWithEncoding (Encoding encoding)
    {
        Encoding = encoding;
    }    
}

Или, если вам нужен только UTF-8 (это все, что мне часто нужно):

public sealed class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding => Encoding.UTF8;
}

Что касается того, почему вы не можете сохранить свой XML в базе данных - вы ' Если вы хотите, чтобы мы смогли диагностировать / исправить это, вам нужно будет сообщить нам более подробную информацию о том, что произошло, когда вы попытались это сделать.

207
ответ дан 24 November 2019 в 05:55
поделиться

При сериализации XML-документа в строку .NET необходимо установить кодировку UTF-16. Строки хранятся внутри как UTF-16, так что это единственная кодировка, которая имеет смысл. Если вы хотите хранить данные в другой кодировке, используйте вместо этого массив байтов.

SQL Server работает по аналогичному принципу; любая строка, передаваемая в столбец xml , должна быть закодирована как UTF-16. SQL Server отклонит любую строку, в которой в объявлении XML не указан UTF-16. Если декларация XML отсутствует, то стандарт XML требует, чтобы по умолчанию использовался UTF-8, поэтому SQL Server также отклонит это.

Имея это в виду, вот некоторые служебные методы для выполнения преобразования.

public static string Serialize<T>(T value) {

    if(value == null) {
        return null;
    }

    XmlSerializer serializer = new XmlSerializer(typeof(T));

    XmlWriterSettings settings = new XmlWriterSettings()
    {
        Encoding = new UnicodeEncoding(false, false), // no BOM in a .NET string
        Indent = false,
        OmitXmlDeclaration = false
    };

    using(StringWriter textWriter = new StringWriter()) {
        using(XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings)) {
            serializer.Serialize(xmlWriter, value);
        }
        return textWriter.ToString();
    }
}

public static T Deserialize<T>(string xml) {

    if(string.IsNullOrEmpty(xml)) {
        return default(T);
    }

    XmlSerializer serializer = new XmlSerializer(typeof(T));

    XmlReaderSettings settings = new XmlReaderSettings();
    // No settings need modifying here

    using(StringReader textReader = new StringReader(xml)) {
        using(XmlReader xmlReader = XmlReader.Create(textReader, settings)) {
            return (T) serializer.Deserialize(xmlReader);
        }
    }
}
]
126
ответ дан 24 November 2019 в 05:55
поделиться
Другие вопросы по тегам:

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