[英]what happens when an object derives from MarshalByRefObject and is also marked [Serializable]?
[英]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.