Создать XML-файл из объекта - PullRequest
1 голос
/ 07 апреля 2010

Я работаю веб-разработчиком с веб-дизайнером, и мы обычно делаем так: - Я создаю систему, я генерирую некоторые XML-файлы - дизайнер отображает XML-файлы с помощью xslt

Ничего нового.

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

  • пустой установщик для моего свойства

  • пустой параметр-конструктор less

  • реализовать IXmlSerializable и выдать «notimplementedexception» при десериализации

  • сделать копию класса с открытыми полями

Ответы [ 5 ]

4 голосов
/ 07 апреля 2010

Хорошо, неправильно прочитал ваш вопрос в первый раз! Уверен, что нет способа избежать этого. имеет для конструктора без параметров, и вы не можете сериализовать свойства только для чтения. Я думаю, что ваш единственный вариант - DataContractSerializer .

1 голос
/ 07 апреля 2010

http://blogs.mastronardi.be/Sandro/2007/08/22/CustomXMLSerializerBasedOnReflectionForSerializingPrivateVariables.aspx

В этой статье описывается создание настраиваемого XML-сериализатора, чтобы вы могли сериализовать частные поля - это может занять некоторое время приведения к нужной форме, но это проще, чем кажется (честно!) И это хорошее начало для написания ваш собственный сериализатор / десериализатор, который будет сериализовать именно то, что вы хотите - и не заботится о конструкторах без параметров или свойствах для записи.

Единственное другое решение, которое я могу придумать, - создать класс-обертку для каждого сериализуемого класса, но я не знаю, насколько это будет хорошо в долгосрочной перспективе. Просто создается впечатление, что это нехорошо.

0 голосов
/ 07 апреля 2010

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

namespace Aesop.Dto
{
    using System;
    using System.Xml.Serialization;

    /// <summary>
    /// Represents an Organization ID/Name combination.
    /// </summary>
    [Serializable]
    public sealed class Org
    {
        /// <summary>
        /// The organization's name.
        /// </summary>
        private readonly string name;

        /// <summary>
        /// The organization's ID.
        /// </summary>
        private readonly int id;

        /// <summary>
        /// Initializes a new instance of the <see cref="Org"/> class.
        /// </summary>
        /// <param name="name">The organization's name.</param>
        /// <param name="id">The organization's ID.</param>
        public Org(string name, int id)
        {
            this.name = name;
            this.id = id;
        }

        /// <summary>
        /// Prevents a default instance of the <see cref="Org"/> class from
        /// being created.
        /// </summary>
        private Org()
        {
        }

        /// <summary>
        /// Gets or sets the organization's name.
        /// </summary>
        /// <value>The organization's name.</value>
        [XmlAttribute]
        public string Name
        {
            get
            {
                return this.name;
            }

            set
            {
            }
        }

        /// <summary>
        /// Gets or sets the organization's ID.
        /// </summary>
        /// <value>The organization's ID.</value>
        [XmlAttribute]
        public int ID
        {
            get
            {
                return this.id;
            }

            set
            {
            }
        }
    }
}
0 голосов
/ 07 апреля 2010

Хорошо, теперь я понимаю это. Я не думаю, что может быть какой-либо способ сделать это с помощью XMLSerialization. XMLSerialization нужна эта информация для повторного заполнения объекта. Он не знает, что некоторые пользователи никогда не десериализуют данные. Возможно, вам придется написать некоторый код для генерации XML для ваших объектов.

0 голосов
/ 07 апреля 2010
class Preferences
{
    private const string filePreferences = "preferences.xml";

    public Preferences() { }

    public static Preferences Load()
    {
        Preferences pref = null;
        if (File.Exists(Preferences.FileFullPath))
        {
            var serializer = new System.Xml.Serialization.XmlSerializer(typeof(Preferences));
            using (var xmlReader = new System.Xml.XmlTextReader(Preferences.FileFullPath))
            {
                if (serializer.CanDeserialize(xmlReader))
                {
                    pref = serializer.Deserialize(xmlReader) as Preferences;
                }
            }
        }
        return ((pref == null) ? new Preferences() : pref);
    }

    public void Save()
    {
        var preferencesFile = FileFullPath;
        var preferencesFolder = Directory.GetParent(preferencesFile).FullName;

        using (var fileStream = new FileStream(preferencesFile, FileMode.Create))
        {
            new System.Xml.Serialization.XmlSerializer(typeof(Preferences)).Serialize(fileStream, this);
        }
    }
}
...