代码之家  ›  专栏  ›  技术社区  ›  Mr. Smith

C中的XML序列化与反射#

  •  0
  • Mr. Smith  · 技术社区  · 15 年前

    XML Serialization from MSDN :

    序列化和 反序列化对象 输入和输出XML文档。这个 使用XmlSerializer可以控制 对象如何编码为XML。

    Reflection from MSDN

    反射提供对象(类型为 类型)封装组件, 模块和类型。你可以用 反射以动态创建 类型的实例,将类型绑定到 现有对象,或 获取类型 从现有对象并调用其 方法或访问其字段 性质 . 如果您正在使用 代码中的属性,反射 使您能够访问它们。

    据我所知,我可以使用XML序列化在运行时创建对象?换句话说,假设我有一个数据库,我可以在两个表中定义我的“类”或“对象”。然后我可以获取对象数据的XML,然后在运行时创建该对象。

    我还可以将这些对象编译为随时可用的库,然后使用反射来访问它的函数。

    根据您的理解,这两个概念中的哪一个在牺牲最低性能的同时提供了最大的灵活性?如果您能提供一个考虑因素的详细解释,也许还有一个代码示例,那么您就可以获得加分。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Mark Seemann    15 年前

    序列化和反射不是互斥的。您可以明确地序列化和反序列化一个对象,然后使用反射修改它。

    串行化

    序列化只是获取对象状态的“快照”的概念,以便您以后可以还原该快照。

    如果您希望将对象存储在持久存储中,那么如果您不需要能够查询特定值,那么序列化是一个不错的选择。

    请注意,至少有两种不同类型的序列化:

    • 串行化 ,将对象表示为XML。因为它是XML,所以这种表示(至少在理论上)是人类可读和可互操作的。
    • 二进制序列化 以字节数组的形式存储和读取对象。这种表示是专有的,不能被人阅读。

    反射

    反射是使用对象元数据来操作对象的能力。例如,您可以决定要将字符串“foo”分配给给定对象的所有可写字符串属性,而不考虑对象的类型。

    当设计时不知道对象的类型时,这是最有趣的。

        2
  •  0
  •   Rune Grimstad    15 年前

    要使用反序列化对象,需要知道要将其反序列化到的类型。因此,不能只从XML创建对象,而不在程序集中定义其类型。

    您可以做的是将XML存储在表示序列化对象的数据库中。然后可以从数据库中加载XML,并根据需要将其反序列化到对象实例中。XML的源不需要是序列化对象,因此可以根据需要手动创建它。

    使用反射将是另一种情况。通过反射,您可以获取一个对象,并获得该对象上可用的方法和属性的列表。然后,您可以编写动态处理对象的代码,而不管它们实现的是哪种类型。这种方法的问题在于代码编写和读取都很笨拙,并且很容易引入只在运行时可见的错误。此外,由于使用反射带来的开销,代码将运行缓慢。

    我不使用反射,而是让我的对象实现一些我可以将它们强制转换到的已知接口。这将允许我的代码是类型安全的,并且我可以避免反射的麻烦。代码也会运行得更快,可读性更强。

        3
  •  0
  •   Martin Liversage    15 年前

    既不能使用XML序列化也不能使用反射动态创建新类型。这些技术只适用于现有类型。如果需要在运行时创建新类型,则必须使用其他方法。但是,生成fly类型的用处有限,因为您只能使用反射来访问这些类型。在.NET的下一个主要版本中使用动态运行时将为您提供创建和使用动态类型的更多选项。

    XML序列化用于将对象序列化为已知格式(XML)。反射更通用,使您能够在运行时检查类型信息,并在编译时操作对象,而不必知道其类型。您也可以使用反射进行序列化,但与XML序列化相比,它要麻烦得多。