簡體   English   中英

為什么我們不能有一個標記為[Serializable]的類,同時繼承MarshalByRefObject?

[英]Why can't we have a class marked [Serializable] and at the same time inheriting from MarshalByRefObject?

我知道這聽起來很愚蠢,但我只是好奇。 我的講師問了這個問題,我們一無所知。 :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

我懷疑這就是具體的反例。

我懷疑你的講師只是想遠程的,即我們期望的東西要么被遠程化作為代理/存根對,或者通過序列化。 但是,這是無效的。

  • [Serializable]也純粹用於遠程處理之外的序列化目的
  • 遠程類可以(通常是)單獨使用,也可以獨立於遠程使用
  • 遠程已經死了 ; 請告訴他們停止教遠程教學

或者,考慮:

使用遠程處理時, MarshalByRefObject指示對象應由代理/存根遠程控制 - 否則,對象需要可序列化,因此需要[Serializable] 然而,相反的情況並非如此: [Serializable] 並不意味着“按值進行編組”(簡單地說:缺少MarshalByRefObject意味着“按值進行編組”)。 類型可以通過代理/存根進行序列化和遠程處理。 這里沒有沖突。

MarshalByRefObject已經標記為Serializable ,所以這看起來有點奇怪。

但是,這更多是關於邏輯上使用您擁有的工具。 由於MarshalByRefObject實際上是使用代理訪問的,因此當您使用代理時,它們沒有要序列化的本地狀態。 這就是MarshalByRefObject 當您使用序列化時,您正在傳輸(或保存)狀態 - 當通過引用進行編組時,您只是傳輸對象的引用。 因此序列化是一個副本,而ref的編組仍然引用同一個對象,甚至是跨應用程序域邊界。

現在,據我所知,實際上沒有檢查以確保該對象不可序列化 - 但是,實際上,當它從應用程序域外部使用時,實際上沒有任何序列化的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM