XML-сериализация и необходимость открытых свойств - PullRequest
3 голосов
/ 12 мая 2011

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

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)result;
}

(обработка ошибок опущена)

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

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

Заранее спасибо,
Frank

1 Ответ

2 голосов
/ 12 мая 2011

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

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

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

Но это только мои $ 0,02

...