Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将没有属性的类标记为可序列化是否毫无意义?_C#_Serialization - Fatal编程技术网

C# 将没有属性的类标记为可序列化是否毫无意义?

C# 将没有属性的类标记为可序列化是否毫无意义?,c#,serialization,C#,Serialization,我在代码库中处理代码分析警告时遇到了这段代码。我想更改名称,但不想更改是否会导致序列化问题。虽然在我看来,它是可序列化的没有任何意义,但我只是想在剥离属性之前检查以确保没有遗漏某些内容 [Serializable] public class FileIsNotReadonlyVerifier : IFileVerifier { #region IFileVerifier Members public void Verify(FileInfo file, FlatFileTraff

我在代码库中处理代码分析警告时遇到了这段代码。我想更改名称,但不想更改是否会导致序列化问题。虽然在我看来,它是可序列化的没有任何意义,但我只是想在剥离属性之前检查以确保没有遗漏某些内容

[Serializable]
public class FileIsNotReadonlyVerifier : IFileVerifier
{
    #region IFileVerifier Members
    public void Verify(FileInfo file, FlatFileTrafficSystem system)
    {
        if ((file.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
        {
            throw new VerificationException(Resources.VerificationException_FileIsReadonly);
        }
    }
    #endregion
}

如果该类根本不携带状态(如您的示例中所示),我同意,它是毫无意义的,除非您需要它用于一些模糊的远程处理场景(以及其他一些可能同样奇怪的场景)。

不完全如此。我曾经使用过一个XML标准(开放旅游联盟),它的类型只是一个emtpy标记,没有属性
,因此这只是在我的代码中实现为一个可序列化的类,没有属性。它用于来自web服务的响应消息中,以指示服务器进程已成功。

是,请将其标记为可序列化。原因是如果您不这样做,则使用您的类型的任何人都将无法序列化此类的实例

[Serializable] 
public class MyType {

  // Breaks serialization.  
  private readonly FileIsNotReadonlyVerifier _verifier;

  // Might work, might break.  Depends on the implementation.  Have to use 
  // another context variable to serialize / deserialize this. 
  private readonly IFileVerifier _otherVerifier;

}
在这种情况下,使其工作的唯一方法是使变量不可序列化,使用另一个变量跟踪状态,并使用fixup逻辑重写特殊的序列化方法


这个问题我已经遇到好几次了,非常令人沮丧。最值得注意的是,我在人们创建自定义字符串比较器的地方遇到过它,而这些比较器没有成员。为了序列化我的类型,我不得不经历很多困难。非常令人沮丧

你的班级没有封闭;如果意图是有人可以将其子类化并需要对其进行序列化,那么可能需要添加
[Serializable]

然而;我不会添加
[Serializable]
“仅仅因为”;序列化(如线程或继承)应该进行规划、设计和测试。如果您当前没有序列化类型或预见到需要序列化它,那么很可能您没有针对这些场景对其进行充分的设计/测试(这是100%正确的;您不会浪费时间编写不必要的代码)

如果其他人使用您的类并希望序列化,他们可以通过将本地字段标记为
[NonSerialized]
并手动处理(可能在回调中)来实现


还要注意的是,在许多方面,
BinaryFormatter
(它是
[Serializable]
的主要使用者)本身存在设计问题,并且相当脆弱。有一些基于合同的序列化程序提供了更高的稳定性。

为什么要这么多?当然,如果给定一个特定的接口,您可以将其包装起来。@leppie,是的。但它要么需要1)另一个变量和hacky fixup逻辑,要么需要2)作为序列化容器并代理对真实接口的调用的包装器类。这两种情况都比默认的不做任何事情要复杂得多。在这种情况下,您只需在_verifier上面添加[NonSerialized]并在回调中执行即可。@Marc,是的,对于我有具体类型的情况,这很好。但是,当我只有接口和多个可能的实现时,它需要[NonSerialized]加上其他上下文变量来重建验证器。。。你为什么要序列化你不能完全控制的东西?这听起来像是一个无法再次读取的数据配方…(XmlSerializer不关心
[Serializable]
)对于基于契约的序列化程序,您是指在WCF中实现的结构还是其他什么?如果是WCF,序列化契约是否可以移植到WCF之外的其他上下文中?或者-p WCF数据契约可通过WSDL进行移植;但也存在其他基于契约的序列化程序;例如,“协议缓冲区”是一种二进制序列化格式(使用.NET版本protobuf-NET(我的;-p)和dotnet protobufs),它非常可移植,但您需要自己进行传输;