如何在序列化时排除特定类型?

12

我使用sgen针对包含大量类型的程序集进行运行。我想要排除其中的两个类型进行序列化,但似乎找不到方法。

我发现sgen有一个/type开关用于指定特定类型,但没有排除特定类型的选项。

是否有一种方法可以从序列化中排除特定类型?


1
也许我没有理解你的问题,但 sgen 只生成序列化程序集。在其中再加入另外两个类会有什么问题吗? - Hanan M
1
如果您想这样做是因为SGEN抱怨有相同的类名,那么打开您的.csproj文件,您可能会找到<SGenUseProxyTypes>false</SGenUseProxyTypes>标签。我删除了这些标签,同时保留<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>,错误消失了。 - Louis Somers
4个回答

3

除了将你想要排除的类型放在另一个程序集中,你不能从序列化器生成中排除类型。

更新

其他帖子提出了一些额外的可能性来排除特定类型,根据你的用例可行性不同。


1
我知道这很老旧。但是去掉无参构造函数怎么样?这似乎可以防止 sgen 处理类。 - Tom
@Tom 是的,这对我有效。考虑发布一个相应的答案 - 我会点赞的。 - tm1

1
你可以尝试将想要排除在Xml序列化之外的类的访问权限标记为internal,然后sgen.exe应该会跳过该类。
internal class NotToBeSerialized
{
    ...
}

但是我需要排除那些我需要从另一个程序集中使用的类型的生成。 - binki

1
为了防止类被包含在sgen处理中,请确保它没有无参数的构造函数。
正如这个问题的答案Why XML-Serializable class need a parameterless constructor所解释的那样,序列化需要一个参数少的构造函数(任何权限级别),才能工作。仅使无参数构造函数私有不足以将其排除在sgen处理之外。

-6

不确定您是否正在寻找此内容,但您可以在类定义之前提到 [NonSerialized] 来排除自己的类序列化。 因此,如果要排除特定类型,您将需要继承它并创建自己的类。

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

2
这段代码不应该编译通过,因为 NonSerialized 属性的唯一目标是字段。 - tm1
1
错误2:属性“NonSerialized”在此声明类型上无效。它仅在“字段”声明上有效。 - Ryan Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接