1.直接比较byte[]当然可以 2.对相同type地对象执行二进制序列化操作,结果是唯一确定地,并不像你们认为地结果是不确定地,微软早期通讯框架Remoting地核心就是远程二进制对象序列和反序列,如果无法保证二进制序列地唯一性,这个Remoting谁敢用?ps:楼上有人说 public int Num{get;set;}生成地是有别地东西,对于你的代码,在编译后已经确定下来了,也就是对相同type地对象,在运行期地时候早就是固定地了,另外还需要说明地是对象在内存里地数据空间是数据空间,而type的元数据是元数据,他在另一个地方存储地和数据空间并不干扰,二进制序列本质上只管数据空间地东西,而不管元数据里面的东西,元数据在编译后有唯一确定地和这个type挂钩地元数据
能正确的反序列化 与 生成的byte[]是否相同 完全是两回事。
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;} }
上面已经说了,无论你干什么以前请先判定type是否一样包括6楼地代码 if(obj is B) 另外在说你这个,你这两东西在二进制序列地时候,其实就是一样地。很奇怪么???如果经常和标准dll打交道,玩pinvoke地人会告诉你,如果把A对象地内存数据直接copy到B里面达到赋值,这个操作是可行地 ========================================================= 但是序列化之后是不相同的字段名,这种情况下怎么说A和B的值相等额,我上面一直在说地是二进制序列化,而不是你认为地文本序列化,二进制序列化根本没有啥字段不字段的说法,二进制序列化就是把对象在内存里那份数据空间相关内存数据给取出来了(他只是内存里滴一段byte[]和type地元数据没有啥关系)
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);
}
}
return this.ToString().Equal(b.ToString());
从中实现你的相等逻辑。md5不管是从理论上还是实际上都不可取。一则消耗资源太多。二则,从理论上说,两个不一样的字符串也可以生成相同的md5.
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;
}
还有 GetProperties
还有 GetProperties
一个结构,包含大量的东西,
直接用 T4 模板,生成, 类似 (st1.a==st2.a)&&(st1.b==st2.b)&&(st1.c==st2.c)&&..... 这样就不必在运行的时候用 GetFields , GetProperties
还有 GetProperties
一个结构,包含大量的东西,
直接用 T4 模板,生成, 类似 (st1.a==st2.a)&&(st1.b==st2.b)&&(st1.c==st2.c)&&..... 这样就不必在运行的时候用 GetFields , GetProperties 谢谢你的方法,但如果对于structure里还有structure,这样处理起来反射好多层得。
我现在就是按你的方法处理的。具体如下:
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;
}目前测试下来,可以用哈不知道会不会有什么漏洞。
举个最简单的例子。
public int Num{get;set;}
编译器会悄悄为这个属性生成一个字段,但是编译器不保证生成的这个字段名每次都一样。所以序列化后的内容也不保证会一样
2.无论使用任何比较方法前都应该去判定type是否一样,哪怕是你写滴方法,你还是需要优先去判定一下type是否一致
3.MD5理论上存在碰撞,但是自然碰撞基本是上千亿分之一。目前很多金融体系仍然在用md5做数据校验保证,金融银行都不怕,你怕啥
要么实现Equals或者IEquable<valueType>.Equals,要么使用反射递归遍历。
1.直接比较byte[]当然可以
2.对相同type地对象执行二进制序列化操作,结果是唯一确定地,并不像你们认为地结果是不确定地,微软早期通讯框架Remoting地核心就是远程二进制对象序列和反序列,如果无法保证二进制序列地唯一性,这个Remoting谁敢用?ps:楼上有人说 public int Num{get;set;}生成地是有别地东西,对于你的代码,在编译后已经确定下来了,也就是对相同type地对象,在运行期地时候早就是固定地了,另外还需要说明地是对象在内存里地数据空间是数据空间,而type的元数据是元数据,他在另一个地方存储地和数据空间并不干扰,二进制序列本质上只管数据空间地东西,而不管元数据里面的东西,元数据在编译后有唯一确定地和这个type挂钩地元数据
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;}
}
=========================================================
但是序列化之后是不相同的字段名,这种情况下怎么说A和B的值相等额,我上面一直在说地是二进制序列化,而不是你认为地文本序列化,二进制序列化根本没有啥字段不字段的说法,二进制序列化就是把对象在内存里那份数据空间相关内存数据给取出来了(他只是内存里滴一段byte[]和type地元数据没有啥关系)
你地结构B,在内存里同样就是一个int长度地byte[]在内存里只管 首地址,偏移量和老p说地size,那管你是啥米字段了
如果你说的是memoryCopy,字对齐后面的空间可能是被污染的,但这些污染并不影响有效数据空间。
目前我就是按wanghui0380的序列化后比较的。只是做比较时用了最简单的一一是否相等来处理。简单实用哈。。谢谢各位 。