Почему XmlWriter всегда выводит кодировку utf-16?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
26
задан Cœur 7 January 2019 в 08:46
поделиться

3 ответа

Насколько я знаю, класс StringWriter всегда будет использовать кодировку UTF 16 при сериализации в строку. Вы можете написать свой собственный класс переопределения, который принимает другую кодировку:

public class StringWriterWithEncoding : StringWriter
{
    private readonly Encoding _encoding;

    public StringWriterWithEncoding()
    {
    }

    public StringWriterWithEncoding(IFormatProvider formatProvider)
        : base(formatProvider)
    {
    }

    public StringWriterWithEncoding(StringBuilder sb)
        : base(sb)
    {
    }

    public StringWriterWithEncoding(StringBuilder sb, IFormatProvider formatProvider)
        : base(sb, formatProvider)
    {
    }


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

    public StringWriterWithEncoding(IFormatProvider formatProvider, Encoding encoding)
        : base(formatProvider)
    {
        _encoding = encoding;
    }

    public StringWriterWithEncoding(StringBuilder sb, Encoding encoding)
        : base(sb)
    {
        _encoding = encoding;
    }

    public StringWriterWithEncoding(StringBuilder sb, IFormatProvider formatProvider, Encoding encoding)
        : base(sb, formatProvider)
    {
        _encoding = encoding;
    }

    public override Encoding Encoding
    {
        get { return (null == _encoding) ? base.Encoding : _encoding; }
    }
}

, так что вы можете использовать это вместо:

using(var stringWriter = new StringWriterWithEncoding( Encoding.UTF8))
{
   ...
}
15
ответ дан Bojin Li 7 January 2019 в 08:46
поделиться
  • 1
    Это имеет смысл, но почему не только изменяют то, на что указывает указатель? – Will Gwo 25 July 2018 в 00:21
  • 2
    Это имеет смысл, но почему не только изменяют то, на что указывает указатель? – Will Gwo 25 July 2018 в 00:21
  • 3
    Это имеет смысл, но почему не только изменяют то, на что указывает указатель? – Will Gwo 25 July 2018 в 00:21
  • 4
    Это имеет смысл, но почему не только изменяют то, на что указывает указатель? – Will Gwo 25 July 2018 в 00:21
  • 5
    Это имеет смысл, но почему не только изменяют то, на что указывает указатель? – Will Gwo 25 July 2018 в 00:21

как @ john-saunders упомянул в своем ответе:

StringWriter всегда будет использовать UTF-16

, поэтому я использовал MemoryStream для этих целей.

В моем случае я использовал кодировку windows-1251.

var xmlSstring = "";
using (var ms = new MemoryStream())
{
    var encoding = Encoding.GetEncoding(1251);
    var settings = new XmlWriterSettings
    {
        Indent = true,
        Encoding = encoding
    };

    using (var xmlTextWriter = XmlWriter.Create(ms, settings))
    {
        doc.Save(xmlTextWriter);
        xmlString = encoding.GetString(ms.ToArray());
    }
}
1
ответ дан aleha 7 January 2019 в 08:46
поделиться

Если вы не хотите использовать класс, производный от StringWriter, то в вашем случае вы можете просто установить OmitXmlDeclaration в false и объявить свой собственный, как я делаю ниже:

 public static string Serialize<T>(this T value, string xmlDeclaration = "<?xml version=\"1.0\"?>") where T : class, new()
        {
            if (value == null) return string.Empty;

            using (var stringWriter = new StringWriter())
            {
                var settings = new XmlWriterSettings
                {
                    Indent = true,
                    OmitXmlDeclaration = xmlDeclaration != null,
                };

                using (var xmlWriter = XmlWriter.Create(stringWriter, settings))
                {
                    var xmlSerializer = new XmlSerializer(typeof(T));

                    xmlSerializer.Serialize(xmlWriter, value);

                    var sb = new StringBuilder($"{Environment.NewLine}{stringWriter}");

                    sb.Insert(0, xmlDeclaration);

                    return sb.ToString();
                }
            }
0
ответ дан CarneyCode 7 January 2019 в 08:46
поделиться
Другие вопросы по тегам:

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