none
XmlSerializer RRS feed

  • Вопрос

  • Возникла проблема при использовании метода XmlSerializer.Deserialize, если в xml- тексте свойстве обьекта встречается сочитание Environment.NewLine (“\r\n”), то после десериализации в свойстве объекта останется только (“\n”). Свойство объекта текстовое поле, соответственно текст отображается в любом контроле одной строкой. Почему так работает метод XmlSerializer.Deserialize и как это исправить?

     

    Пример:

    ///
     Класс

    [XmlRoot("XmlTableTriggers")]
    public class XmlTableTriggers
    {
       public XmlTableTriggers(){}
       public XmlTableTriggers(string name, string sqlText)
       {
           Name = name;
           SqlText = sqlText;
       }

       [XmlAttribute]
       public string Name { get; set; }

       [XmlElement]
       public string SqlText { get; set; } // Здесь используется Environment.NewLine

    }

    ///
     Метод который выполняет десериализацию
    public static T XmlStr2Obj<T>(string xml)

    {

       if (xml == null) return default(T);

       if (xml == string.Empty) return (T)Activator.CreateInstance(typeof(T));

       using (StringReader reader = new StringReader(xml))

       {

          XmlSerializer sr = SerializerCache.GetSerializer(typeof(T));

          return (T)sr.Deserialize(reader); // После десериализации в свойстве trigger.SqlText будут отсутствовать ‘\r’ останется только '\n' вместо “\r\n”

       }

    }

    /// Использование:
    XmlTableTriggers trigger = XmlUtil.XmlStr2Obj<XmlTableTriggers>(xml);

    /// XML

    <XmlTableTriggers Name="track_%TABLE%_insert">
            <SqlText>%OPERATION% TRIGGER track_%TABLE%_insert
    ON %TABLE%
    FOR INSERT
      AS
    BEGIN 
      SET NOCOUNT ON
      UPDATE %TABLE% SET parent_uid = uid
        WHERE uid IN (SELECT INSERTED.uid FROM INSERTED WHERE INSERTED.parent_uid IS NULL)
    END
    GO</SqlText>
     </XmlTableTriggers>

    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:58 MSDN Forums Consolidation (От:Visual C#)
    15 октября 2009 г. 14:09

Ответы

  • Это поведение регламентировано стандатром. Чтобы его обойти, нужно использовать XmlWriter.Create() с параметром XmlWriterSetting.NewLineHandling = NewLineHandling.Entitize.

    Ссылка


    - Dmitri Nesteruk
    • Предложено в качестве ответа I.Vorontsov 16 октября 2009 г. 4:38
    • Помечено в качестве ответа DenisX555 16 октября 2009 г. 12:12
    15 октября 2009 г. 19:11