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

标签 c# .net .net-remoting

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

相关文章:

c# - WPF 是否有无需第三方库即可进行 2D 图表的首选方法?

c# - 如何使用 SharpSSH 或 SSH.NET 库在 SFTP 服务器上附加文本文件

c# - CheckedListBox 数据绑定(bind)到项目的选中状态

wcf - .NET 通过 WCF 远程处理?

c# - 我可以用 throw 移除空捕获吗?

c# - MS Graph API - 来自 C# 的 getPstnCalls

c# - 如何正确显示 WebBrowser 控件中加载的当前真实 url?

javascript - 更新面板删除了 URL 片段

c# - 如何在 .NET Remoting 中远程处理事件?

时间:2018-01-08 标签:c#linq: how to retrieve a single result