【问题标题】:.Net Serialization, XmlDataReader, a SQL Database and the FlagsAttribute!.Net 序列化、XmlDataReader、SQL 数据库和 FlagsAttribute!
【发布时间】:2010-01-21 23:06:18
【问题描述】:

简要介绍一下我的情况:

我正在开发一个非常依赖序列化的 N 层应用程序,对象主要以序列化方式与数据库交互,对象和集合作为 XML 从存储过程中插入、更新和读取。

对于一些较小的数据类,我只是使用 ExecuteNonQuery、Reader 等与数据交互,因为它更容易,但我遇到了问题。

使用 ExecuteNonQuery 将数据插入到数据库中,使用参数 - 插入的一些数据是附加了 FlagAttribute 的枚举属性(作为整数存储在数据库中)。在枚举上,例如:

<Flags()> _
Public Enum Fruit As Integer
    <Description("None"), XmlEnum("0")> None = 0
    <Description("Apple"), XmlEnum("1")> Apple = 1
    <Description("Banana"), XmlEnum("2")> Banana = 2
    <Description("Orange"), XmlEnum("4")> Orange = 4
End Enum

读回的值可能是整数值 1、3、7 等,并且不使用序列化插入到数据库中,但是当它作为使用 ExecuteXmlReader 的更大类组的一部分被读回时(填充XmlReader 对象),然后需要反序列化,它不能,例如 7,导致 'Instance validation error: '7' is not a valid value for Fruit',因为它期望它以以下格式序列化:

<fruitOptions>1 2 4<fruitOptions>

总而言之,这有点令人困惑,我可以通过将其以 1、2、4 格式存储在数据库中来解决它,但遗憾的是,它不是当前所处的 int 类型。

有人对此有任何想法吗?

【问题讨论】:

    标签: enums xmlreader flags xmlserializer


    【解决方案1】:

    您将不得不询问您的 DBA 或您正在使用的存储过程的作者。看来他们已经指定此字段不是枚举,而是列表。

    【讨论】:

    • 数据以 int 形式存储在数据库中,因为我们希望随后可以对其进行按位运算。问题是当它被反序列化时,它期望结果在上面的示例中,即水果节点 - 因此无法将其序列化回来。它可以作为一串数字存储在数据库中,如上所示,但是我们不能对其进行任何按位操作,还不如使用其他数据类型(如 XML)来帮助查询数据?虽然我宁愿将数据库中的数据保留为 int 类型,但知道如何做到这一点并仍然使用序列化吗?
    • @Nathan 你有没有找到解决这个问题的方法?
    猜你喜欢
    • 1970-01-01
    • 2022-06-26
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2016-03-27
    • 2011-10-12
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多