Ну, и ноль (xsi: nil) и пустая строка являются значениями - они просто не являются желаемыми значениями.
Во время десериализации (на клиенте или сервере):
Вы могли бы попытаться поместить некоторый код в установщик, чтобы вызвать исключение для недопустимых значений?
В качестве альтернативы (для более сложных случаев) я считаю, что контракты данных поддерживают обратные вызовы десериализации, которые должны позволить вам проверить ...
Например, вы можете добавить (в частичном классе, если необходимо, на клиенте):
[OnDeserialized]
internal void OnDeserialized(StreamingContext context)
{
if (string.IsNullOrEmpty(Bar))
{
throw new InvalidOperationException("No Bar!");
}
}
Для проверок перед отправкой (на клиенте) вам потребуется добавить дополнительный метод проверки или, возможно (опять же, в частичном классе):
[OnSerializing]
internal void OnSerializing(StreamingContext context)
{
if (string.IsNullOrEmpty(Bar))
{
throw new InvalidOperationException("No Bar!");
}
}
Однако сервер должен также подтвердить это - вы не можете предположить, что это был ваш код клиента, который отправил сообщение.