是Datacontractserializer的MSDN文档不正确



datacontractserializer的MSDN文档包含以下语句:

仅读取字段,没有GET或设置方法的属性,并且具有内部或私有设置或GET方法的属性未序列化。此类属性被忽略了,除了唯一的收藏外,没有例外。

但是,我刚刚创建了以下程序,该程序序列地序列化,仅使用私有设定的属性。我是在误解某些东西,还是文档不正确?

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string saveFile = "save.xml";
            Foo originalFoo = new Foo();
            SaveState(originalFoo, saveFile);
            Foo restoredFoo = LoadState<Foo>(saveFile);
        }
        public static void SaveState(Object o, string saveFile)
        {
            DataContractSerializer serializer = new DataContractSerializer(o.GetType());
            using (var writer = XmlWriter.Create(saveFile))
                serializer.WriteObject(writer, o);
        }
        public static T LoadState<T>(string loadFile)
        {
            using (var stream = new FileStream(loadFile, FileMode.Open))
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                T obj = (T)serializer.ReadObject(stream);
                return obj;
            }
        }
    }
    [Serializable]
    public class Foo
    {
        private readonly int X;
        private int Y { get; }
        internal int Z { get; private set; }
        public Foo()
        {
            X = Y = Z = 10;
        }
    }
}

您使用了可序列化属性,该属性指示序列化器将所有内容序列化。从文档中:

当将serializableAbeatTribute属性应用于类型时,默认情况下将所有私有字段和公共字段序列化。您可以通过实现iSerializable接口以覆盖序列化过程来更加粒状。

如果您遵守所有属性,则如文档中所述,仅将公共属性和字段序列化。例如,如果添加W属性:

public class Foo
{
    private readonly int X;
    private int Y { get; }
    internal int Z { get; private set; }

    public int W { get; set; }
    public Foo()
    {
        X = Y = Z = 10;
    }
}

生成的文件将包含:

<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SO_Serializer">
    <W>15</W>
</Foo>

如果将DataContract属性添加到类中,则只有标记为DataMember的成员才能序列化

不,这不是不正确!

仅读取字段,没有GET或设置方法的属性,并且具有内部或私有设置或GET方法的属性未序列化。此类属性被忽略了,除了唯一的收藏外,没有例外。

即使该类还实现了可审理的接口以控制序列化过程。

当将serializableAbeatTribute属性应用于类型时,默认情况下将所有私有字段和公共字段序列化。您可以通过实现iSerializable接口以覆盖序列化过程来更加粒状。

或者,您可以通过将非序列化attribute属性应用于字段来排除字段序列化。如果可序列化类型的字段包含指针,句柄或某些针对特定环境的其他数据结构,并且不能在不同的环境中有意义地重构,那么您可能需要将非序列化的attribute属性应用于该字段。

相关内容

  • 没有找到相关文章

最新更新