Как я могу сериализовать System.Security.AccessControl.FileSecurity? - PullRequest
3 голосов
/ 26 ноября 2011

Я работаю над небольшой системой развертывания для нашего собственного программного обеспечения, которое управляет резервным копированием нескольких видов данных.Частью задачи является резервное копирование определенных папок, и я хотел бы сделать резервную копию списков ACL, примененных к этим папкам, чтобы при восстановлении файлы все еще работали, как и ожидалось.

Создание прототипа некоторого кода, я пытался использовать встроенный .NET-in 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 байта независимо от того, в каком файле я их пробую.Есть ли хороший способ сериализации списков ACL с использованием средств .NET?Что я делаю не так?

PS: Да, я знаю, что списки ACL могут быть неприменимы к другим компьютерам.Это не проблема для этого проекта.

Ответы [ 2 ]

6 голосов
/ 26 ноября 2011

Вы можете просто вызвать метод NativeObjectSecurity.Persist , как описано в MSDN , для сериализации этого объекта.Как упомянул один человек, объект не содержит SerializableAttribute, и поэтому вы не можете сериализовать граф объекта дружественным образом.

3 голосов
/ 26 ноября 2011

XmlSerializer сохраняет только открытые члены объекта - он не сериализует ни одного из членов класса DirectorySecurity, потому что у него нет открытых.

Существуют другие сериализаторы, которые могутсохранить непубличные члены (например, BinaryFormatter), но они требуют, чтобы сами типы объявляли себя сериализуемыми (т. е. используя атрибут [Serializable]), а класс DirectorySecurity не имеет этого атрибута.Поэтому вы не можете использовать прямую сериализацию для ее сохранения - вам нужно извлечь информацию, которую вы хотите сохранить, и сохранить ее вместо исходного объекта.

...