我正在为我们的内部软件开发小规模部署系统,该软件管理多种数据的备份。部分任务是备份某些文件夹,我想备份应用于这些文件夹的ACL,以便在恢复时文件仍能按预期工作。
对一些代码进行原型设计,我尝试过使用.NET的内置XmlSerializer,但无济于事。
以下是示例代码:
public static byte[] SerializeFileACL(string path)
{
var acl = File.GetAccessControl(path, AccessControlSections.All);
using (var ms = new MemoryStream())
{
_fileSerializer.Serialize(ms, acl);
return ms.ToArray();
}
}
然而,无论我尝试使用哪个文件,它都会返回相同的143个字节。有没有一种使用.NET工具序列化ACL的好方法?我做错了什么?
P.S。:是的,我知道ACL可能不适用于其他计算机。这不是这个项目的问题。
答案 0 :(得分:6)
您只需调用NativeObjectSecurity.Persist
方法as described on MSDN即可序列化此对象。正如一个人提到的那样,该对象不包含SerializableAttribute
,因此您无法以友好的方式序列化对象图。
答案 1 :(得分:3)
XmlSerializer
仅保存对象的公共成员 - 它不会序列化DirectorySecurity类的任何成员,因为它没有任何公共成员。
还有其他序列化程序可以保存非公共成员(例如BinaryFormatter
),但是它们需要类型本身将自己声明为可序列化(即使用[Serializable]
属性),并且DirectorySecurity
类没有此属性。所以你不能使用直接序列化来保存它 - 你需要提取你想要保存的信息并存储它而不是原始对象。