XML-сериализация и необходимые общедоступные свойства

#c# #serialization #architecture #xml-serialization

#c# #сериализация #архитектура #xml-сериализация

Вопрос:

в моем приложении Silverlight 4 я сохраняю свой объект с помощью DataContractSerializer XML-Serialization — что довольно просто:

 public byte[] SerializeModel(ServiceModel model)
{
    System.Runtime.Serialization.DataContractSerializer serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(ServiceModel));
    System.IO.MemoryStream ms = new System.IO.MemoryStream();

    serializer.WriteObject(ms, model);

    byte[] bytes = ms.ToArray();
    ms.Close();

    return bytes;
}
  

… и легко загружать их через:

 public ServiceModel DeserializeModel(string stream)
{
    System.Runtime.Serialization.DataContractSerializer serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(ServiceModel));
    System.Xml.XmlReader reader = System.Xml.XmlReader.Create(new System.IO.StringReader(stream));

    object result = serializer.ReadObject(reader);

    return (ServiceModel)resu<
}
  

(Обработка ошибок отменена)

Проблема для меня в том, что мне нужно сделать данные для сохранения (или лучше: для загрузки) общедоступными с помощью getter и setter. Это приводит к потере контроля над целостностью данных. Т.е. у меня есть коллекция объектов, и я хочу контролировать, какие объекты следует добавлять или удалять. Мне нужно было бы создать подкласс или повторно реализовать коллекцию, изменив методы добавления и удаления и любой другой метод, который мне нужно было бы контролировать. Но, сделав его закрытым, я не могу использовать DataContractSerializer.

Есть предложения, как сделать это простым, но при этом сохранить контроль над объектами внутри класса?

Заранее спасибо,
Фрэнк

Комментарии:

1. Разве вы не можете управлять этим в установщике?

Ответ №1:

Обычно то, что я делаю в таких ситуациях, — это сохраняю свои объекты сериализации как POCOs (просто получаю / устанавливает), а затем, как только я их десериализую, я выполню любые дополнительные проверки, которые мне нужно выполнить, и создам / обработаю ошибку соответствующим образом.

Итак, это означает, что у меня есть свой «интерфейс» для сериализации, который является просто POCO, а затем, как только я его десериализую, я выполняю любые проверки согласованности и загружаю / адаптирую в свои объекты. Там, где я работаю, мы делаем это с помощью наших веб-сервисов, где у нас есть объекты нашего домена и классы интерфейса. Как только мы получаем запрос, мы адаптируем его к нашим бизнес-объектам, а затем передаем его на бизнес-уровень и возвращаем процесс к результатам.

Я рассматриваю сериализацию как пересечение уровня, и поэтому все входные данные должны быть проверены, а затем адаптированы, чтобы свести связь к минимуму.

Но это всего лишь мои 0,02 доллара