在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
类似序列化对象的方法有很多,.net的XmlSerializer类提供了多种方法,可以把一个对象序列化,保存到XML文件中,再从XML文件中取得字段信息。也可以利用反射,直接取值,虽然使用反射有损性能,但我们没有大量使用,而且很多时候是用作单元测试,所以也不失为一个解决方案。下面就简单说一下利用反射来序列化对象并进行比较。 一、首先,我们自定义一个类Person
public class Person 然后,序列化这个类
{ public string Name { get; set; } public int Age { get; set; } }
public string SerializeObject(object obj) 接下来就是比较了{ if (null == obj) return string.Empty; Type type = obj.GetType(); FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); StringBuilder objString = new StringBuilder(); foreach (FieldInfo field in fields) { object value = field.GetValue(obj); //取得字段的值 objString.Append(field.Name + ":" + value + ";"); } return objString.ToString(); }
public bool CompareObject(object obj1, object obj2) 好了,我们来测试一下{ if (null == obj1 || null == obj2) return false; if (obj1.GetType() != obj2.GetType()) return false; return SerializeObject(obj1).Equals(SerializeObject(obj2)); }
[TestMethod()] 成功!public void CompareObjectTest() { Class1 target = new Class1(); Person FirstPerson = new Person() { Name = "张三", Age = 20 }; Person SecondPerson = new Person() { Name = "张三", Age = 20 }; bool flag = FirstPerson.ToString().Equals(SecondPerson.ToString()); bool expected = true; bool actual; actual = target.CompareObject(FirstPerson, SecondPerson); Assert.AreEqual(expected, actual); } 二、接下来的一个问题是:如果自定义类中的字段类型为另一个自定义类呢,我们可以在取值时判断是否为自定义类,再递归调用该方法即可。 我们添加Boy类,并把该类添加到Person中的字段
public class Person 接下来只需要修改SerializeObject方法中的foreach循环
{ public string Name { get; set; } public int Age { get; set; } public Boy GoodBody { get; set; } } public class Boy { public string sex { get; set; } }
foreach (FieldInfo field in fields) 同样可以测试通过。{ objString.Append(field.Name + ":"); object value = field.GetValue(obj); //取得字段的值 if (null != value) { Type filedType = value.GetType(); //判断该字段类型是否为类,且不是string类型 if (filedType.IsClass && "String" != filedType.Name) objString.Append(SerializeObject(value)); objString.Append(value); } objString.Append(";"); } 三、其实我们也可以利用C#3.0的新特性-扩展方法,扩展Object类的方法 修改SerializeString方法的参数以及修饰符,包含此方法的类也为静态,调用该扩展方法的类需引用扩展方法所在类的命名空间
public static class ExtensionClass 在单元测试调用此方法,也可通过测试。{ public static string SerializeString(this object obj) { if (null == obj) return string.Empty; Type type = obj.GetType(); FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); StringBuilder objString = new StringBuilder(); foreach (FieldInfo field in fields) { object value = field.GetValue(obj); //取得字段的值 objString.Append(field.Name + ":" + value + ";"); } return objString.ToString(); } } 以上简单总结一下对象的序列化及比较,其实刚才只对对象内部是否包含对象进行了判断,在特殊情况下,还需考虑对象父类的字段信息,当然,这种情况比较少见。 希望有所收获 |
请发表评论