2010-09-06 58 views
1

我使用的BinaryFormatter序列化類和條件的變量。例如:有條件的C#二進制序列

[Serializable] 
public class Class1 
{ 
private Class2 B; 
... 
} 

[Serializable] 
public class Class2{...} 

我想遠程處理時間變量B僅被序列化,而不是當我序列化到文件存儲。 問題:
1)我知道,在XmlSerialization我們可以使用[XmlIgnore]和{}屬性名指定有條件地忽略屬性。這是[NonSerialized]的等價方法嗎?
2)對於具有[Serializable]屬性的類,如何在運行時忽略它?

回答

0
  1. 沒有這樣的方法。您可以通過實現ISerializable控制系列化,如果你這樣做,你就會知道哪些序列化上下文激活(遠程,文件等)
  2. 據我所知沒有辦法做到這一點,你爲什麼要這樣做?

一般來說,我建議你不要使用BinaryFormatter。如果有的話,這是一個維修頭痛。使用XML序列化或某種協議緩衝區。

+0

非常感謝。對於我的情況,實現ISerializable太繁瑣,因爲太多的類和變量。我對protobuf感興趣。它是否也允許自定義序列化?因爲我在GetObjectData()期間轉換了一些值。 – felonny 2010-09-06 08:33:10

+0

您不必在所有類中實現ISerializable,只能在需要自定義邏輯的類中實現。 Protobuf應該允許自定義序列化,但我不確定它會適合您的需求;如果你的數據體系結構是足夠規範的(例如,有關什麼時候應該序列化的規則以及很少的例外),那麼你可能會更好地重新思考數據體系結構或生成自定義的序列化代碼。 – 2010-09-06 12:55:44

0
  1. 如前所述,它不存在。儘管它有點混亂(也就是說,如果你不想像已經提到的那樣實現ISerializable接口),你可以用代碼解決問題。

    [Serializable] 
    public class ClassA 
    { 
        [OnSerializing] 
        private void OnSerializing(StreamingContext context) 
        { 
         //Set BSerialized = B based on context or some internal boolean 
         BSerialized = B; 
        } 
        [OnSerialized] 
        private void OnSerialized(StreamingContext context) 
        { 
         //Clear BSerialized 
         BSerialized = null; 
        } 
        [OnDeserialized] 
        private void OnDeserialized(StreamingContext context) 
        { 
         //Restore B from BSerialized 
         B = BSerialized; 
         BSerialized = null; 
        } 
        [NonSerialized] 
        private ClassB B; 
        private ClassB BSerialized; 
    } 
    [Serializable] 
    public class ClassB { } 
    
  2. 你不能忽視它。您只能在運行時更改屬性的屬性,並且由於NonSerialized屬性不會接受true/false參數,因此無法對其運行時執行任何操作。

0

我寫了一個相當簡單但可擴展的框架來解決這種使用綁定的問題。不知道我完全理解,但是這是可能的:

public class Class1 
{ 
    [Ignore] 
    public bool IsRemoting { get; set; } 

    [SerializeWhen("IsRemoting", true)] 
    public Class2 B; 
} 

http://binaryserializer.codeplex.com