【问题标题】:XML Serialize Friend Classes in VB.netVB.net 中的 XML 序列化友元类
【发布时间】:2025-12-22 03:05:10
【问题描述】:

我在 VB.net (2005) 中有一些类(大约 15 个左右)我希望能够序列化为 xml。不幸的是,它们被标记为朋友类,不能暴露在程序集之外。

程序集是一个 dll,它是 CAD 系统的 com 互操作插件。我已将我所有的班级设置为朋友,这样他们就不会暴露在大会之外以供第 3 方使用。我想知道我是否需要这样做。将类设置为 public 可以让我序列化事情。但是我不希望人们链接到程序集并使用这些类。

我是否应该担心其他程序链接到我的程序集?事实上,我认为这种情况发生的可能性不大。我只是不喜欢让我的几乎所有课程都具有公共范围的想法。

有没有办法让朋友类可序列化?还是我应该把事情公之于众?

干杯, 特洛伊

【问题讨论】:

  • 阅读完其他帖子后,我将公开这些课程。在我的情况下,使用朋友修饰符似乎没有意义。

标签: xml vb.net serialization friend


【解决方案1】:

这种“保护”无论如何都不起作用。人们可以使用反射加载您的程序集,然后使用这些类。所以不公开课程的理由就消失了,这简化了事情。

如果您真的想将类保留在内部,您仍然可以编写自己的序列化代码(完全手动(高效,但需要大量工作)或使用反射),或者您可以提供单独的仅数据类用于序列化目的只有,可以公开。然后,您只需编写代码,将内部类中的数据导入/导出到序列化类,这些类对其他开发人员没有多大用处,因为实际代码在内部类中。

【讨论】:

  • 关于反射的观点很好。我想我会公开我的课程(因为这是 VS 2005 中的默认设置)。
  • 听起来Friend 在某种程度上已被弃用。如果访问修饰符提供的唯一保护仅仅被反射所击败,那么它为什么存在呢?在 VB6/VBA 兼容性之外,即(但 VB.Net 转换器向导应该可以轻松处理)。那个,或者 MS 需要一个可以阻止反射的访问修饰符,但这可能不是一个微不足道的功能。
  • @Kumba:访问修饰符是用于软件开发的工具,而不是用于软件保护的工具。如果您不希望外部任何人使用您的代码,请使用混淆或类似的保护技术(因此至少很难理解该做什么,或者从 C#/VB.net 使用它)。
  • 幸运的是,当我开始使用 Reflector 查看 .NET Framework 时,我意识到了“朋友”的本质。我的一个项目都在一个程序集中,所以Friend 在那里没有什么意义。如果我决定将项目拆分为几个程序集,那么使用Friend 将会产生影响。我正在学习:)
【解决方案2】:

听起来你是一个受过 java 培训的人,正在尝试模仿包的功能。我做对了吗? :-)

你不应该让你的班级成为朋友。来吧,让他们公开。如果您希望它们可序列化,那么您实际上是在刺穿违反 Friend(包)可见性的程序集,这就是它们不可序列化的原因。

如果您希望它们有效地私有但可序列化,请查看System.Reflection.BindingFlags.NonPublic 标志。您可以使用反射使字段(而不是类)可序列化。

【讨论】:

  • 您可能还想通过 COM 使用 ComVisibleAttribute 使它们不可见?
  • 不 - 没有受过 java 训练 - 只是来自 vb6 :)
  • @Bluebill:在同一条船上。我想我会听从建议并公开。 VBA 使我将事物限制在“朋友”中……