我知道这听起来很愚蠢,但我只是好奇。我的讲师问了这个问题,我们一头雾水。 :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/