Неизменность и сериализация XML

Несколько простых шагов:

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

Удостоверяются любой, у кого есть действительная мощность на сайте, имеет безопасный пароль. Потребуйте, чтобы у администраторов / модераторы были более длительные пароли с соединением букв, чисел и символов. Отклоните тривиально простые пароли от обычных пользователей с объяснением.

Одна из самых простых вещей, которые можно сделать, говорят людям, когда кто-то пытался войти в их учетную запись и дать им ссылку для создания отчетов об инциденте, если это не были они. Простое сообщение, когда они входят в систему как "Кто-то, пыталось войти в Вашу учетную запись в 4:20 в среду и тому подобное. Щелкните здесь, если это не было Вами". Это позволяет Вам сохранить некоторую статистику по нападениям. Можно повысить мер контроля и мер безопасности, если Вы видите, что существует внезапное увеличение мошеннических доступов.

31
задан John Saunders 19 August 2009 в 22:27
поделиться

4 ответа

Предполагая, что это ваш «неизменяемый» объект:

public class Immutable
{
    public Immutable(string foo, int bar)
    {
        this.Foo = foo;
        this.Bar = bar;
    }

    public string Foo { get; private set; }
    public int Bar { get; private set; }
}

Вы можете создать фиктивный класс для представления этого неизменяемого объекта во время сериализации / десериализации:

public class DummyImmutable
{
    public DummyImmutable(Immutable i)
    {
        this.Foo = i.Foo;
        this.Bar = i.Bar;
    }

    public string Foo { get; set; }
    public int Bar { get; set; }

    public Immutable GetImmutable()
    {
        return new Immutable(this.Foo, this.Bar);
    }
}

Когда у вас есть свойство типа Immutable, не сериализуйте его, а вместо этого сериализуйте DummyImmutable:

[XmlIgnore]
public Immutable SomeProperty { get; set; }

[XmlElement("SomeProperty")]
public DummyImmutable SomePropertyXml
{
    get { return new DummyImmutable(this.SomeProperty); }
    set { this.SomeProperty = value != null ? value.GetImmutable() : null; }
}

Хорошо, это немного длинно для чего-то, что выглядит таким простым ... но это должно работать;)

11
ответ дан 27 November 2019 в 22:41
поделиться

Неизменяемость Realio-trulio включает в себя конструктор. Неизменяемость Popsicle - это то, что вы можете сделать, например:

Person p = new Person();
p.Name = "Fred";
p.DateOfBirth = DateTime.Today;
p.Freeze(); // **now** immutable (edit attempts throw an exception)

(или то же самое с инициализатором объекта)

Это подходит для DataContractSerializer достаточно хорошо, если вы обрабатываете сериализованный обратный вызов для выполнения Заморозка . XmlSerializer не выполняет обратные вызовы сериализации, поэтому требуется больше работы.

Однако любой вариант подойдет, если вы используете настраиваемую сериализацию ( IXmlSerializable ). Точно так же настраиваемая сериализация в общих чертах выполнима с неизменяемостью realio-trulio, но болезненна - и это немного ложь, поскольку это «создать один раз, затем вызвать метод интерфейса» - так что не совсем правильно неизменяемый.

Для истинной неизменяемости используйте DTO.

10
ответ дан 27 November 2019 в 22:41
поделиться

Я рекомендую взглянуть на обсуждение здесь: Почему классу XML-Serializable нужен конструктор без параметров .

Вам следует рассмотреть возможность использования DataContractSerializer. Насколько я могу судить из документации, для этого не требуется конструктор без параметров и можно сериализовать / десериализовать частные члены.

2
ответ дан 27 November 2019 в 22:41
поделиться

Я только что прочитал статью, на которую вы ссылались. В его терминологии объекты, использующие поля только для чтения, инициализированные в конструкторе, называются «неизменяемость только для записи».

«Неизменяемость Popsicle» немного отличается. Липперт приводит два примера того, где это было бы полезно: десериализация (проблема, которую вы пытаетесь решить) и циклические ссылки, где A и B должны быть созданы независимо, но A должна иметь ссылку на B, а B - ссылка на A .

Здесь были упомянуты два более очевидных способа достижения этого результата (фактически, когда я писал это). Шаблон, который упоминает Томас Левеск, в основном является шаблоном «Строитель». Но в данном случае это довольно громоздко, потому что вам нужно не только перейти от Builder к Immutable, но также от Immutable до Builder, чтобы сериализация / десериализация была симметричной.

Таким образом, шаблон «блокировки», как упомянул Марк Гравелл, кажется более полезным. Я не знаком с C #, поэтому не знаю, как лучше его реализовать. Я думаю, что частная собственность типа заблокирована . Затем всем методам получения необходимо явно проверить, заблокирован ли объект (он же «заморожен»). В таком случае они должны генерировать исключение (это ошибка времени выполнения; вы не можете принудительно установить неизменяемость popstick во время компиляции).

Затем всем методам получения необходимо явно проверить, заблокирован ли объект (он же «заморожен»). В таком случае они должны генерировать исключение (это ошибка времени выполнения; вы не можете принудительно установить неизменяемость popstick во время компиляции).

Затем всем методам получения необходимо явно проверить, заблокирован ли объект (он же «заморожен»). В таком случае они должны генерировать исключение (это ошибка времени выполнения; вы не можете принудительно установить неизменяемость popstick во время компиляции).

1
ответ дан 27 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: