Это решение зависит от использования вами службы WCF:
- Внутренняя служба, используемая вашими собственными .NET-системами, использующими ту же модель домена.
- Внешняя служба, используемая различными платформами, которые не используют одну и ту же модель домена.
Дело 1.
Сериализация - это процесс сохранения состояния объекта. Состояние объекта в C # представлено его полями данных.
Свойства в C # по сути - методы, которые манипулируют состоянием объекта. Их использование может привести к различной десериализации состояния объекта, поскольку порядок, в котором устанавливаются свойства, может влиять на его конечное состояние данных. Другие факторы также могут привести к неправильной десериализации состояния, если, например, метод (набор свойств) зависит от некоторого изменяющегося контекста, например текущего DateTime.
Вы можете сказать, что насчет инкапсуляции? Я не хочу, чтобы мой объект находился в недопустимом состоянии, и я должен выполнять проверки достоверности, проверки целостности графа объектов и т. Д. Да, вы должны, поэтому мы помещаем атрибуты DataMember на подпорки? №
Проблема в том, что многие люди смешивают две разные вещи: DTO (объект передачи данных, контракт WCF) с сущностью домена. Что вам нужно, это убедиться, что данные, которые вы получаете, точно те же данные, которые были отправлены, а затем убедитесь, что вы можете создать действительный объект домена из этих данных. Лучший способ добиться этого - использовать отдельные классы для DTO и создавать из них Domain Entity.
Но большинство программистов ленивы, и им нравится просто украшать Domain Entity с атрибутами DataMemeber. В этом случае решение Field или Prop зависит от того, где находится ваша логика валидации, если ваша логика валидации похоронена в методах Set, вам придется использовать Props, если он является внешним, вы должны использовать Fields, и валидировать вашу Domain Entity после десериализации.
P.S. Я думаю, что те же правила применимы к любому процессу сериализации, как постоянство базы данных.
Также я хотел бы отметить, что Silverlight не может сериализовать \ десериализовать приватные поля, потому что вы не можете получить к ним доступ извне, используя отражение, и вам придется сделать их приватными и использовать InternalsVisibleToAttribute.
Дело 2.
Это сложный вопрос. Основное внимание здесь уделяется взаимодействию. В 99,9% у вас будут отдельные классы DTO в этом случае и, скорее всего, множество различных версий для поддержки старых клиентов. Неважно, куда вы помещаете атрибуты DataMembers, потому что вы используете DTO. Я не буду объяснять этот сценарий, потому что разработчики, работающие в такой крупномасштабной системе, как правило, достаточно опытны и не читают SO.