重要编辑:这应该兼容并允许绑定?
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(...)]
带有唯一标识标记)。如前所述,它也可以推断出这些,但更安全(不那么脆弱)是明确的。