C# 添加自动属性会影响远程处理吗?

C# 添加自动属性会影响远程处理吗?,c#,serialization,remoting,C#,Serialization,Remoting,我们有一个巨大的客户端/服务器WinForms应用程序,它使用.NET远程处理在层之间传递DAO,这有一些问题 早在我来到这里之前,所有DAO都被定义为使用字段而不是属性,并且不能将字段绑定到控件 将字段或属性添加到DAO会更改序列化格式,这需要双客户端/服务器部署,这比客户端或服务器部署困难得多(我们必须根据医生的时间表来减少停机时间) 使用一个简单的、人为的和想象的例子,可以改变对象: public class Employee { public int ID; public

我们有一个巨大的客户端/服务器WinForms应用程序,它使用.NET远程处理在层之间传递DAO,这有一些问题

  • 早在我来到这里之前,所有DAO都被定义为使用字段而不是属性,并且不能将字段绑定到控件
  • 将字段或属性添加到DAO会更改序列化格式,这需要双客户端/服务器部署,这比客户端或服务器部署困难得多(我们必须根据医生的时间表来减少停机时间)
  • 使用一个简单的、人为的和想象的例子,可以改变对象:

    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用户群提供这些修复(同样是免费的)。我很想看一个例子。谢谢你的快速回复。