簡體   English   中英

條件C#二進制序列化

[英]Conditional C# Binary Serialization

我正在使用BinaryFormatter按條件序列化一個類及其變量。 例如:

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

[Serializable]
public class Class2{...}

我希望僅在遠程處理時間將變量B序列化,而不是在將其序列化到文件存儲時才進行序列化。 問題:
1)我知道在XmlSerialization中,我們可以使用[XmlIgnore]和{PropertyName} Specified來有條件地忽略該屬性。 這是[NonSerialized]的等效方法嗎?
2)對於具有[Serializable]屬性的類,如何在運行時忽略它?

我編寫了一個相當簡單但可擴展的框架,以使用綁定來解決此類問題。 不確定我是否完全理解,但這是可能的:

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

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

http://binaryserializer.codeplex.com

  1. 沒有這種方法。 您可以通過實現ISerializable來控制序列化,如果您這樣做,您將知道哪個序列化上下文處於活動狀態(遠程處理,文件等)。
  2. AFAIK沒辦法,為什么要這樣?

一般來說,我建議您不要使用BinaryFormatter 如果有的話,這是一個維護難題。 使用XML序列化或某種協議緩沖區。

  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參數,因此您無法在運行時對其進行任何操作。

暫無
暫無

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

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