#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 доллара