能具体说说怎么弄吗?
你的意思是把struct2byte,然后呢?

解决方案 »

  1.   

    你在struct 里override Equals方法,比如
    struct A
      {
          public int a { get; set; }
     
          public override bool Equals(object obj)
          {
              if (obj == null) return false;
    if(obj is B)
    {
    var b=(B)obj;return this.a==b.a;
    }return base.Equals(obj);
          }
      }
      

  2.   

    如果成员变量很多的话,你可以继续override ToString方法,把成员变量拼成一个字符串,然后比较
    return this.ToString().Equal(b.ToString());
      

  3.   

    如果成员比较少可以用6楼地方法如果成员比较多而且追求通用地化,则采用我1楼给地方法ps: 从你的回答,我想你大概知道struct2byte怎么玩,所以不说了。后面就是把byte[]数组采用MD5算法算出特征值,用这个特征值比较就ok了
      

  4.   

    6楼正解重写equals方法就可以了。。equals方法是基于object的。。而所有东西都继承了object
      

  5.   

    让结构体继承IEquable<T>接口,实现Equals方法.
    从中实现你的相等逻辑。md5不管是从理论上还是实际上都不可取。一则消耗资源太多。二则,从理论上说,两个不一样的字符串也可以生成相同的md5.
      

  6.   

            struct MyStruct {
                public int a;
                public char b;
                public bool c;
                public static bool eee(MyStruct st1,MyStruct st2){
                    return typeof(MyStruct).GetFields().All(a => a.GetValue(st1).Equals(a.GetValue(st2)));
                }
                public override bool Equals(object obj){
                    throw new NotImplementedException();
                }
                public override int GetHashCode(){
                    throw new NotImplementedException();
                }
            } static void Main(string[] args) {
                MyStruct vvz;
                vvz.a=56;
                vvz.b='z';
                vvz.c=false;
                MyStruct vvx;
                vvx.a=98;
                vvx.b='x';
                vvx.c=true;
                MyStruct vvc;
                vvc.a=56;
                vvc.b='z';
                vvc.c=false;
                Console.WriteLine(MyStruct.eee(vvz,vvz));
                Console.WriteLine(MyStruct.eee(vvz,vvx));
                Console.WriteLine(MyStruct.eee(vvz,vvc));
                Console.WriteLine(MyStruct.eee(vvx,vvc));
                return;

      

  7.   


    还有 GetProperties 
      

  8.   


    还有 GetProperties 
    一个结构,包含大量的东西,
    直接用  T4 模板,生成, 类似  (st1.a==st2.a)&&(st1.b==st2.b)&&(st1.c==st2.c)&&.....  这样就不必在运行的时候用  GetFields , GetProperties 
      

  9.   


    还有 GetProperties 
    一个结构,包含大量的东西,
    直接用  T4 模板,生成, 类似  (st1.a==st2.a)&&(st1.b==st2.b)&&(st1.c==st2.c)&&.....  这样就不必在运行的时候用  GetFields , GetProperties 谢谢你的方法,但如果对于structure里还有structure,这样处理起来反射好多层得。
      

  10.   


    我现在就是按你的方法处理的。具体如下:
           bool Is_Equals(Object obj1, Object obj2)
            {
                byte[] first_bytes = tools.StructToBytes(obj1);
                byte[] sencond_bytes = tools.StructToBytes(obj2);
             //   bool reval= Array.Equals(first_bytes, sencond_bytes);
                bool reval = false;
                reval =first_bytes.Intersect(sencond_bytes).Count() == first_bytes.Union(sencond_bytes).Count();
                return reval;
               
            }目前测试下来,可以用哈不知道会不会有什么漏洞。
      

  11.   

    6楼正解,重写equals 目的为了让你给出一个比较相等的规则
      

  12.   

    StructToBytes的问题在于如果是2个结构并不一样的Struct比较就不行了,你的例子是 A,B 2个Struct
      

  13.   

    强烈不推荐使用序列化来比较结果。因为序列化有多种多样的方式,而且还有很多自定义的方式。
    举个最简单的例子。
    public int Num{get;set;}
    编译器会悄悄为这个属性生成一个字段,但是编译器不保证生成的这个字段名每次都一样。所以序列化后的内容也不保证会一样
      

  14.   

    1.二进制序列化基本只有一种方式,不存在特别歧义滴地方
    2.无论使用任何比较方法前都应该去判定type是否一样,哪怕是你写滴方法,你还是需要优先去判定一下type是否一致
    3.MD5理论上存在碰撞,但是自然碰撞基本是上千亿分之一。目前很多金融体系仍然在用md5做数据校验保证,金融银行都不怕,你怕啥
      

  15.   

    序列化了再算MD5不是画蛇添足吗?直接比较两个byte[]不行吗?而且序列化并不保证生成一样的byte[]。
    要么实现Equals或者IEquable<valueType>.Equals,要么使用反射递归遍历。
      

  16.   


    1.直接比较byte[]当然可以
    2.对相同type地对象执行二进制序列化操作,结果是唯一确定地,并不像你们认为地结果是不确定地,微软早期通讯框架Remoting地核心就是远程二进制对象序列和反序列,如果无法保证二进制序列地唯一性,这个Remoting谁敢用?ps:楼上有人说 public int Num{get;set;}生成地是有别地东西,对于你的代码,在编译后已经确定下来了,也就是对相同type地对象,在运行期地时候早就是固定地了,另外还需要说明地是对象在内存里地数据空间是数据空间,而type的元数据是元数据,他在另一个地方存储地和数据空间并不干扰,二进制序列本质上只管数据空间地东西,而不管元数据里面的东西,元数据在编译后有唯一确定地和这个type挂钩地元数据
      

  17.   

    能正确的反序列化 与 生成的byte[]是否相同 完全是两回事。
      

  18.   


    1.直接比较byte[]当然可以
    2.对相同type地对象执行二进制序列化操作,结果是唯一确定地,并不像你们认为地结果是不确定地,微软早期通讯框架Remoting地核心就是远程二进制对象序列和反序列,如果无法保证二进制序列地唯一性,这个Remoting谁敢用?ps:楼上有人说 public int Num{get;set;}生成地是有别地东西,对于你的代码,在编译后已经确定下来了,也就是对相同type地对象,在运行期地时候早就是固定地了,另外还需要说明地是对象在内存里地数据空间是数据空间,而type的元数据是元数据,他在另一个地方存储地和数据空间并不干扰,二进制序列本质上只管数据空间地东西,而不管元数据里面的东西,元数据在编译后有唯一确定地和这个type挂钩地元数据

    那你告诉我,假设下面这两个结构实例里面的Num属性值是相等,但是序列化之后是不相同的字段名,这种情况下怎么说A和B的值相等?
    structr A
    {
    public int Num{get;set;}
    }structr B
    {
    public int Num{get;set;}
    }
      

  19.   

    上面已经说了,无论你干什么以前请先判定type是否一样包括6楼地代码  if(obj is B)  另外在说你这个,你这两东西在二进制序列地时候,其实就是一样地。很奇怪么???如果经常和标准dll打交道,玩pinvoke地人会告诉你,如果把A对象地内存数据直接copy到B里面达到赋值,这个操作是可行地
    =========================================================
    但是序列化之后是不相同的字段名,这种情况下怎么说A和B的值相等额,我上面一直在说地是二进制序列化,而不是你认为地文本序列化,二进制序列化根本没有啥字段不字段的说法,二进制序列化就是把对象在内存里那份数据空间相关内存数据给取出来了(他只是内存里滴一段byte[]和type地元数据没有啥关系)
      

  20.   

    二进制序列化结果,取决与内存数据分布。他和字段没关系你地结构A,在内存里就是 一个int长度地byte[]
    你地结构B,在内存里同样就是一个int长度地byte[]在内存里只管 首地址,偏移量和老p说地size,那管你是啥米字段了
      

  21.   

    你说的二进制序列化莫非不是BinaryFormatter.Serialize?这个序列化默认情况可是要记录(程序集标识+类型名称+字段名称)的。
    如果你说的是memoryCopy,字对齐后面的空间可能是被污染的,但这些污染并不影响有效数据空间。
      

  22.   

    而且楼主并没有保证struct A与struct B的成员位置定义一致。
      

  23.   

    首先lz地前提是struct,他本身是值类型。所以memoryCopy是可以做到地其次对于字节对齐方式,这个对于自己的项目是可控地。
      

  24.   

    哇,大家讨论的好深刻
    目前我就是按wanghui0380的序列化后比较的。只是做比较时用了最简单的一一是否相等来处理。简单实用哈。。谢谢各位 。