【问题标题】:How to exclude specific types from serialization?如何从序列化中排除特定类型?
【发布时间】:2012-07-19 03:56:54
【问题描述】:

我使用大量类型对我的程序集运行sgen。我想从序列化中排除 2 种类型。我似乎无法找到方法。

我看到sgen 有一个/type 开关来指定特定类型,但没有排除特定类型。

有没有办法从序列化中排除特定类型?

【问题讨论】:

  • 可能我没看懂你的问题,但是sgen 只生成序列化程序集。那里还有另外两个班级有什么问题?
  • 如果你想这样做是因为 SGEN 抱怨类名相同,然后打开你的 .csproj 文件,你可能会找到 <SGenUseProxyTypes>false</SGenUseProxyTypes> 标签。我删除了这些,同时单独留下<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>,错误就消失了。

标签: .net serialization .net-4.0 sgen


【解决方案1】:

为防止类被包含在 sgen 处理中,请确保它没有无参数构造函数。

正如对这个问题Why XML-Serializable class need a parameterless constructor 的回答所解释的那样,序列化需要任何权限级别的无参数构造函数才能工作。 将无参数构造函数设为私有是不够的,将 if 从 sgen 处理中排除。

【讨论】:

    【解决方案2】:

    除了将您希望排除的类型放在不同的程序集中之外,您不能从序列化器生成中排除类型。

    更新

    其他海报提出了排除特定类型的额外可能性,根据您的用例具有不同的适用性。

    【讨论】:

    • 我知道这是旧的。但是删除无参数构造函数呢?这似乎阻止了 sgen 处理类。
    • @Tom 是的,这对我有用。考虑发布相应的答案 - 我会投票。
    【解决方案3】:

    您可以尝试更改要从 Xml 序列化中排除的类的访问权限,方法是将类标记为 internal,然后 sgen.exe 应该跳过该类。

    internal class NotToBeSerialized
    {
        ...
    }
    

    【讨论】:

    • 但是我需要排除需要从另一个程序集中使用的类型的生成。
    【解决方案4】:

    不确定您是否正在寻找这个,但您可以通过在类定义之前提及 [NonSerialized] 来将您自己的类排除在序列化之外。 因此,如果您想排除特定类型,则必须从它继承并创建自己的类

    [NonSerialized]
    public class Point
    {
        public int x, y;
    }
    

    【讨论】:

    • 这段代码不应编译,因为NonSerialized 属性的唯一目标是字段。
    • 错误 2 属性“NonSerialized”在此声明类型上无效。它仅对“字段”声明有效。
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 2020-06-25
    • 2019-02-04
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多