gpt4 book ai didi

c# - 为什么我们不能有一个标记为 [Serializable] 并同时继承自 MarshalByRefObject 的类?

转载 作者:太空狗 更新时间:2023-10-30 00:52:09 25 4
gpt4 key购买 nike

我知道这听起来很愚蠢,但我只是好奇。我的讲师问了这个问题,我们一头雾水。 :D

最佳答案

您的讲师不正确。

foreach(var type in typeof(Uri).Assembly.GetTypes())
{
if (type.IsAbstract) continue;
if (!Attribute.IsDefined(type, typeof(SerializableAttribute))) continue;
if (!typeof(MarshalByRefObject).IsAssignableFrom(type)) continue;
Console.WriteLine(type.FullName);
}

显示(请注意,我在这里只看一个程序集):

System.Media.SoundPlayer
System.Net.FileWebRequest
System.Net.FileWebResponse
System.Net.HttpWebRequest
System.Net.HttpWebResponse
System.Diagnostics.EventLogEntry

果然,http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx显示:

[SerializableAttribute]
public class HttpWebRequest : WebRequest,
ISerializable

还注意到:

[SerializableAttribute]
public abstract class WebRequest : MarshalByRefObject,
ISerializable

对于 mscorlib (typeof(object)),我们得到:

System.IO.Stream+SyncStream
System.IO.DirectoryInfo
System.IO.FileInfo
System.IO.MemoryStream
System.IO.TextReader+SyncTextReader
System.IO.StreamReader
System.IO.TextWriter+SyncTextWriter
System.IO.StreamWriter
System.IO.StringReader
System.IO.StringWriter
System.IO.Stream+NullStream
System.IO.TextReader+NullTextReader
System.IO.TextWriter+NullTextWriter

我想这已经是足够具体的反例了。

我怀疑您的讲师考虑远程处理,即我们希望某些东西要么作为代理/ stub 对或通过序列化进行远程处理。但是,这是无效的。

  • [Serializable] 也纯粹用于远程之外的序列化目的
  • 可远程处理的类可以(并且通常)单独使用并独立于远程处理
  • 远程处理已死;请告诉他们停止教授远程处理

或者,考虑:

当使用远程处理时,MarshalByRefObject 指示对象应该通过代理/ stub 远程处理 - 否则,对象需要可序列化,因此需要 [Serializable] .然而,反之则不然:[Serializable] 意味着“按值编码”(简单地说:缺少 MarshalByRefObject 是什么意思“按值(value)编码”)。一个类型既可以被序列化,也可以被代理/ stub 远程控制。这里没有冲突。

关于c# - 为什么我们不能有一个标记为 [Serializable] 并同时继承自 MarshalByRefObject 的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23239628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com