如何序列化System.Security.AccessControl.FileSecurity?

时间:2011-11-25 21:17:00

标签: .net windows serialization acl

我正在为我们的内部软件开发小规模部署系统,该软件管理多种数据的备份。部分任务是备份某些文件夹,我想备份应用于这些文件夹的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可能不适用于其他计算机。这不是这个项目的问题。

2 个答案:

答案 0 :(得分:6)

您只需调用NativeObjectSecurity.Persist方法as described on MSDN即可序列化此对象。正如一个人提到的那样,该对象不包含SerializableAttribute,因此您无法以友好的方式序列化对象图。

答案 1 :(得分:3)

XmlSerializer仅保存对象的公共成员 - 它不会序列化DirectorySecurity类的任何成员,因为它没有任何公共成员。

还有其他序列化程序可以保存非公共成员(例如BinaryFormatter),但是它们需要类型本身将自己声明为可序列化(即使用[Serializable]属性),并且DirectorySecurity类没有此属性。所以你不能使用直接序列化来保存它 - 你需要提取你想要保存的信息并存储它而不是原始对象。