C# 添加自动属性会影响远程处理吗?
我们有一个巨大的客户端/服务器WinForms应用程序,它使用.NET远程处理在层之间传递DAO,这有一些问题C# 添加自动属性会影响远程处理吗?,c#,serialization,remoting,C#,Serialization,Remoting,我们有一个巨大的客户端/服务器WinForms应用程序,它使用.NET远程处理在层之间传递DAO,这有一些问题 早在我来到这里之前,所有DAO都被定义为使用字段而不是属性,并且不能将字段绑定到控件 将字段或属性添加到DAO会更改序列化格式,这需要双客户端/服务器部署,这比客户端或服务器部署困难得多(我们必须根据医生的时间表来减少停机时间) 使用一个简单的、人为的和想象的例子,可以改变对象: public class Employee { public int ID; public
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; }
}
更改序列化格式,破坏与旧客户端的兼容性?重要编辑:这应该兼容并允许绑定
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
实现)使用字段名。使用“自动属性”会断开字段名
只要您同时更新客户端和服务器,它就应该可以工作。另一个选项是使用与名称无关的序列化,例如。如果需要,我可以提供一个示例(它支持ISerializable
用法)
(顺便说一下,添加属性应该不会影响BinaryFormatter
,因为它是基于字段的)
根据要求,这里有一个用于控制远程序列化的示例(直接取自我的一个示例);请注意,在客户端和服务器都同意之前,这也是不兼容的,但应该能够承受之后的更改(它的设计非常可扩展)。请注意,有很多方法可以使用它-无论是显式成员表示法(如数据契约)还是隐式字段(如
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,只需将执行传递给引擎即可。
[ProtoMember(…)]
定义字段(具有唯一标识标记)。如前所述,它也可以推断出这些,但更安全(不那么脆弱)的是要明确。你是protobuf网络的作者,这会有所帮助;)嗯,是的。但它是免费的,所以这不是营销。事实上,谷歌董事会解决了许多有线格式的问题。我很高兴能够为.NET用户群提供这些修复(同样是免费的)。我很想看一个例子。谢谢你的快速回复。