我在SQL server中有一个审计表。它是为每个高级用户动作记录一个条目,例如更新记录,添加新记录,删除记录等。
我有一种检测和记录所有更改的机制(在.NET中,而不是数据库中的触发器),并且有一组记录字段名称,先前值和新值的对象。我想将字段更改存储在同一个表中(不是在单独的表中,即我不想要一个完整的规范化关系设计),所以我有一个blob字段(或者它可能是一个字符我希望记录字段级审计数据。
我想我只是想拿走我的对象图(基本上只是这些字段更改对象的列表)并将其序列化并将序列化版本存储在表中。
稍后,当用户想要查看更改时,我可以反序列化字段并重新构建字段更改。
那么,.NET 3.5中最好的框架/序列化格式是什么?我不太关心尺寸,也不一定是人类可读的。
答案 0 :(得分:4)
对于长期存储的任何内容(例如在数据库中),请避免使用BinaryFormatter
;因为它包含类型/程序集元数据,您可以很容易地发现以后无法反序列化数据。此外,它是特定于.NET的!如果你想从任何其他平台阅读它,你就会有点沮丧。
JSON(通过Json.NET)将制作一个简单,可读的格式,不占用太多空间。通过XmlSerializer
或DataContractSerializer
的Xml可以正常但 可读。如果空间是你最关心的问题,可能就像“协议缓冲区”(protobuf-net等) - 没有支持的实用程序dll几乎不可能读取,但是非常快速和高效。
我个人想要使用JSON。这意味着我可以在SSMS中阅读审核......
答案 1 :(得分:2)
要序列化对象,您需要使用[Serializable]属性标记对象类,或者实现ISerializable接口,即
。 [Serializable]
public class MySerializableClass
{
...
}
或
using System.Runtime.Serialization;
public class MySerializableClass : ISerializable
{
SerializationInfo info;
StreamingContext context;
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
this.info = info;
this.context = context;
// implementation code goes here
}
}
另请查看IFormatter,您可以在其中选择要将对象序列化的数据类型。
答案 2 :(得分:1)
我可能会使用xml,尽管二进制文件最适合大小/性能。
使用xml,您仍然可以使用SQL查询数据,您不必过于担心对象的版本控制。如果使用二进制文件,则必须考虑版本控制,以防对象发生变化。