Важное редактирование: это должно быть совместимо и разрешать связывание?
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 remoting использует BinaryFormatterm, который (без специальной реализации ISerializable
) использует имена полей. Использование автоматических свойств ломает имена полей.
Пока вы обновляете клиент и сервер одновременно, он должен работать. Другой вариант - использовать независимую от имени сериализацию, например protobuf-net . Я могу привести пример, если хотите (он поддерживает использование ISerializable
).
(кстати, добавление свойств должно не влиять на BinaryFormatter
, так как оно основано на полях)
По запросу, вот пример использования protobuf-net для управления удаленной сериализацией (взятой непосредственно из одного из модульных тестов ); обратите внимание, что это будет также несовместимым до тех пор, пока и клиент, и сервер не согласятся, но должны выдерживать изменения после этого (он предназначен для очень расширяемого). Обратите внимание, что существует множество способов его использования - либо явное обозначение члена (например, контракты данных), либо неявные поля (например, BinaryFormatter
) и т. Д. (Все, что между ними) ... это всего лишь one способ его использования:
[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);
}
}
Здесь 2 нижних метода удовлетворяют ISerializable
и просто передают выполнение движку protobuf-net . [ProtoMember(...)]
определяет поля (с уникальными идентификационными маркерами). Как уже говорилось, он также может выводить их, но более безопасно (менее хрупко) быть явным.