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属性应用于该字段。