Важное редактирование: это должно быть совместимо и разрешать привязку?
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