我应该如何序列化一些简单的审计数据以存储在SQL表中?

时间:2009-07-17 07:42:14

标签: c# serialization

我在SQL server中有一个审计表。它是为每个高级用户动作记录一个条目,例如更新记录,添加新记录,删除记录等。

我有一种检测和记录所有更改的机制(在.NET中,而不是数据库中的触发器),并且有一组记录字段名称,先前值和新值的对象。我想将字段更改存储在同一个表中(不是在单独的表中,即我不想要一个完整的规范化关系设计),所以我有一个blob字段(或者它可能是一个字符我希望记录字段级审计数据。

我想我只是想拿走我的对象图(基本上只是这些字段更改对象的列表)并将其序列化并将序列化版本存储在表中。

稍后,当用户想要查看更改时,我可以反序列化字段并重新构建字段更改。

那么,.NET 3.5中最好的框架/序列化格式是什么?我不太关心尺寸,也不一定是人类可读的。

3 个答案:

答案 0 :(得分:4)

对于长期存储的任何内容(例如在数据库中),请避免使用BinaryFormatter;因为它包含类型/程序集元数据,您可以很容易地发现以后无法反序列化数据。此外,它是特定于.NET的!如果你想从任何其他平台阅读它,你就会有点沮丧。

JSON(通过Json.NET)将制作一个简单,可读的格式,不占用太多空间。通过XmlSerializerDataContractSerializer的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查询数据,您不必过于担心对象的版本控制。如果使用二进制文件,则必须考虑版本控制,以防对象发生变化。