Важна редакция: това трябва да е съвместимо и да позволява обвързване?
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);
}
}
Тук долните 2 метода удовлетворяват ISerializable
и просто предават изпълнението на protobuf-net двигател. [ProtoMember(...)]
дефинира полета (с уникални идентификационни маркери). Както вече беше посочено, той също може да направи изводи за тях, но е по-безопасно (по-малко крехко) да бъде изрично.
person
Marc Gravell
schedule
09.02.2009