【发布时间】:2017-03-13 15:54:40
【问题描述】:
MSDN documentation for DataContractSerializer 包含以下语句:
只读字段、没有 get 或 set 方法的属性以及具有内部或私有 set 或 get 方法的属性不会序列化。此类属性将被忽略且不会引发异常,除非是 get-only 集合。
但是,我刚刚创建了以下程序,它可以很好地序列化只读、仅获取和私有集属性。是我误解了什么,还是文档不正确?
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;
}
}
}
【问题讨论】:
-
您使用了
Serializable属性,这意味着serialize everything -
该文档页面看起来不完整。在Types Supported by the Data Contract Serializer 中可以找到更完整的文档,其中指出支持的类型包括标有 SerializableAttribute 属性的 Types。 .NET Framework 基类库中包含的许多类型都属于这一类。 DataContractSerializer 完全支持 .NET Framework 远程处理、BinaryFormatter 和 SoapFormatter 使用的这种序列化编程模型,包括对 ISerializable 接口的支持。
标签: c# msdn datacontractserializer