Повлияет ли добавление автоматических свойств на удаленное взаимодействие?

У нас есть огромное приложение WinForms клиент / сервер, которое использует удаленное взаимодействие .NET для передачи DAO между уровнями, что имеет несколько проблем.

  1. Все DAO были определены для использования полей вместо свойств задолго до того, как я сюда попал, и вы не можете связывать поля с элементами управления.
  2. Добавление полей или свойств в DAO изменяет формат сериализации, требуя двойного развертывания клиент / сервер, что для нас намного сложнее, чем развертывание клиента или сервера (мы должны работать с графиками врачей, чтобы минимизировать время простоя).

Используя простой, надуманный и воображаемый пример, можно изменить объект следующим образом:

public class Employee
{
    public int ID;
    public string Name;
    public DateTime DateOfBirth;
}

к этому:

public class Employee
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
}

изменить формат сериализации, нарушив совместимость со старыми клиентами?


person Chris Doggett    schedule 09.02.2009    source источник


Ответы (1)


Важное редактирование: это должно быть совместимо и разрешать привязку?

public class Employee
{
    private int id;
    private string name;
    private DateTime dateOfBirth;
    public int ID { get {return id;} set {id = value;} }
    public string Name { get {return name;} set {name = value;} }
    public DateTime DateOfBirth { get {return dateOfBirth;}
         set {dateOfBirth = value;} }
}

Конечно, стоит попробовать, не так ли?

Да, это вызовет проблемы, если клиент / сервер не синхронизированы.

В удаленном взаимодействии .NET используется BinaryFormatterm, который (без специальной реализации ISerializable) использует имена полей. Использование автоматических свойств приводит к разрыву имен полей.

Пока вы обновляете клиент и сервер одновременно, он должен работать. Другой вариант - использовать независимую от имени сериализацию, например protobuf-net. Я могу привести пример, если хотите (поддерживает ISerializable использование).

(кстати, добавление свойств не влияет на BinaryFormatter, поскольку оно основано на полях)


По запросу, вот пример использования protobuf-net для управления сериализацией удаленного взаимодействия (взято прямо из одного из моих модульных тестов < / а>); обратите внимание, что это будет также несовместимо, пока клиент и сервер не согласятся, но он должен выдерживать изменения после этого (он разработан, чтобы быть очень расширяемым). Обратите внимание, что существует множество способов его использования - либо явная нотация членов (например, контракты данных), либо неявные поля (например, BinaryFormatter) и т. Д. (Все, что между ними) ... это всего лишь один способ использования:

[Serializable, ProtoContract]
public sealed class ProtoFragment : ISerializable
{
    [ProtoMember(1, DataFormat=DataFormat.TwosComplement)]
    public int Foo { get; set; }
    [ProtoMember(2)]
    public float Bar { get; set; }

    public ProtoFragment() { }
    private ProtoFragment(
        SerializationInfo info, StreamingContext context)
    {
        Serializer.Merge(info, this);
    }
    void  ISerializable.GetObjectData(
        SerializationInfo info, StreamingContext context)
    {
        Serializer.Serialize(info, this);
    }
}

Здесь два нижних метода удовлетворяют ISerializable и просто передают выполнение protobuf-net двигатель. [ProtoMember(...)] определяет поля (с уникальными идентификационными маркерами). Как уже говорилось, он также может делать эти выводы, но безопаснее (менее хрупко) быть явным.

person Marc Gravell    schedule 09.02.2009
comment
Помогает то, что вы автор protobuf-net;) - person Joel Coehoorn; 09.02.2009
comment
Ну да. Но это бесплатно, так что это не маркетинг. Дело в том, что гугл-боды решили много проблем со своим форматом проводов. Я счастлив, что могу предложить эти исправления, доступные для пользователей .NET (опять же, бесплатно). - person Marc Gravell; 09.02.2009
comment
Хотелось бы увидеть пример. Спасибо за быстрый ответ. - person Chris Doggett; 09.02.2009