代码之家  ›  专栏  ›  技术社区  ›  remi bourgarel

从对象创建XML文件

  •  1
  • remi bourgarel  · 技术社区  · 14 年前

    我是一名网页设计师的网页开发人员,我们通常这样做: -我创建了系统,生成了一些XML文件 -设计器使用XSLT显示XML文件

    没什么新鲜事。

    我的问题是,我使用XML序列化来创建XML文件,但从不使用反序列化。所以我想知道是否有办法避免这样的问题:

    • 我的属性的空setter

    • 空的无参数构造函数

    • 实现IXML可序列化并在反序列化时引发“NotImplementedException”

    • 用公共字段复制类

    5 回复  |  直到 14 年前
        1
  •  4
  •   James    14 年前

    好的,第一次把你的问题读错了!很肯定没有办法避免这种情况。那里 若要成为无参数构造函数,则无法序列化只读属性。我想你唯一的选择是 DataContractSerializer .

        2
  •  1
  •   pete the pagan-gerbil    14 年前

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

    本文描述了如何创建一个自定义的XML序列化器,以便对私有字段进行序列化-可能需要对所需的表单进行一些建模,但这比看起来容易(诚实!)编写自己的serialiser/deserialiser是一个很好的开始,它可以精确地序列化您想要的内容——并且不关心无参数构造函数或可写属性。

    我能想到的另一个解决方案是为每个可序列化类创建一个包装类——但我不知道从长远来看这有多好。我只是觉得不太好。

        3
  •  0
  •   Jesse C. Slicer    14 年前

    我知道您不想添加无参数的构造函数或setter,但这是使用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
                {
                }
            }
        }
    }
    
        4
  •  0
  •   ata    14 年前

    好吧,现在我明白了。我不认为有任何方法可以用XML序列化来完成它。 XML序列化需要这些信息来重新填充对象。它不知道某些用户从未反序列化数据。您可能需要编写一些代码来为对象生成XML。

        5
  •  0
  •   abatishchev Marc Gravell    14 年前
    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);
            }
        }
    }