Здравствуйте, A.Zanevski, Вы писали:
Никак. Не надо использовать BinaryFormatter для таких целей.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237 on Windows 7 6.1.7100.0>>
Здравствуйте, A.Zanevski, Вы писали:
AZ>Код писался в предыдущей версии? Что он делал (в общих чертах, если не секрет)?
Возможность закладывалась при разработке.
А идея была такая:
1) Есть класс атрибута для "пометки" классов, в котором прописывался алиас "помечаемого" класса (т.е. короткое символическое имя класса) и целое число — версия класса.
[AttributeUsage(AttributeTargets.Class)]
public class CustomSerializableAttribute : Attribute
{
...
public CustomSerializableAttribute(string classAlias, int classVersion)
...
}
2) Есть интерфейс, которые должны реализовывать классы для возможности сериализации\десерализации, типа
public interface ICustomSerializable
{
void WriteObject(CustomSerializationWriter writer);
void ReadObject(CustomSerializationReader reader, int classVersion);
}
3) Смысл такой, при сериализации объекта он сам сериализует свои свойства (или там поля) типа значения, каждый аггрегируемый в нем "сложный" объект сериализует себя сам. Сама запись данных в файл\поток\реестр\"или куда там нужно" выполняется с помощью объекта типа производного от CustomSerializationWriter. Помимо значений свойств\полей туда пишется еще и нифа а алиасе класса и версии.
При десереализации сперва читается алиас класс, создается объект соотв. типа, который десерализует себя сам, получив в качестве входного параметра версию сохраненного серализованного класса, программист предусматрительно пишет код, который десерализует старые сериализованные версии.
Внешне все выглядит похоже на встроенную сериализацию, разница лишь в том, что в классах прописаны варианты десериализации в зависимости от версии, что пришла на вход. Что-то типа (простой пример)
public void WriteObject(CustomSerializationWriter writer)
{
writer.WriteString("name", _name);
writer.WriteObject(_items, "items");
}
public void ReadObject(CustomSerializationReader reader, int classVersion)
{
if (classVersion == 1)
reader.ReadString("name", ref _name);
else
reader.ReadString("alias", ref _name);
reader.ReadObject(_items, "items");
}
и задача пользователя этого механизма только в написании вот подобных вещей.
Создание объектов, заполнение коллекций все делается автоматически через рефлексию.
Простите что несколько написано сумбурно, в C# я новичек.
Ясно. Спасибо!