【问题标题】:Is there a way to make a query that looks in serialized binary object in SQL Server 2008?有没有办法在 SQL Server 2008 中的序列化二进制对象中进行查询?
【发布时间】:2011-08-08 07:54:49
【问题描述】:

我有一个名为 Data 的对象,序列化为 varbinary(MAX)。数据对象包含名为 Source 的属性。有没有办法制作类似的东西:

select * from content_table where Data.Source == 'Feed'

我知道使用 XML 序列化 (XQuery) 是可能的。但是在这种情况下不能改变序列化类型。

【问题讨论】:

    标签: c# sql-server serialization deserialization


    【解决方案1】:

    如果您使用过BinaryFormatter,那么不,不是真的——至少,如果不对整个对象模型进行反序列化,这在数据库中通常是不可能的。这是一种未记录的格式,几乎没有提供即席查询。

    注意:BinaryFormatter 不是 (IMO) 与物品存储相关的任何事情的好选择;我完全希望这在某个时候咬你(即无法可靠地反序列化你存储的数据)。痛点:

    • 与类型名称紧密相关;移动代码时可能会中断
    • 与字段名称紧密相关;重构类时可能会中断(即使只是创建一个自动实现的属性也是一项重大更改)
    • 倾向于包含比您预期更大的图表,尤其是通过事件

    它当然也是特定于平台的,并且可能是特定于框架的。

    说真的,我已经记不清这些年来我遇到的“我无法反序列化我的数据”问题的数量了......

    替代的二进制序列化器允许允许一些(有限的)通过阅读器检查数据的能力(不需要完全反序列化),并且可以不与类型元数据绑定(相反,它是基于契约的,允许反序列化为任何合适的类型模型 - 不仅仅是特定类型/版本。

    然而,我真的怀疑这样的工作是否能在WHERE 子句等中达到任何接近效率的效果;您将需要 SQL/CLR 方法等。IMO,这里更好的方法是将所需的 filter 列作为数据存储在其他列中,允许您添加索引等。在极少数情况下,我已经使用了xml 类型,这与我在 there 所做的相同(有一点需要注意的是,您可以使用来自底层 xml 数据的“提升”计算+存储+索引列,这将'这里不可能 - 额外的列必须是明确的)。

    【讨论】:

      【解决方案2】:

      您可以使用SQL CLR 函数反序列化数据。但我怀疑它不会很快。这完全取决于序列化是如何完成的。如果库可用,那么一个简单的 CLR 函数应该可以很容易地查询数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-02
        • 2019-03-04
        • 1970-01-01
        • 2012-08-18
        • 2019-12-25
        • 1970-01-01
        相关资源
        最近更新 更多