2012-02-07 65 views
0

我試圖實現使用.NET IFormatter界面自定義格式。實施IFormatter遞歸

一對夫婦的搜索小時後,我才發現一個非常基本的樣本不幸的是不包括遞歸。我也嘗試使用Reflector來查看BinaryFormatter和SoapFormatter,但它們相當複雜。

我的問題是: 我應該執行遞歸自己,或者有什麼東西我在FormatterServices錯過了什麼?

下面我的代碼:

public void Serialize(Stream serializationStream, object graph) 
{ 
    // Get fields that are to be serialized. 
    MemberInfo[] members = FormatterServices.GetSerializableMembers(graph.GetType(), Context); 

    // Get fields data. 
    object[] data = FormatterServices.GetObjectData(graph, members); 

    // Write class name and all fields & values to file 
    StreamWriter sw = new StreamWriter(serializationStream); 

    string accumulator = string.Empty; 
    for (int i = 0; i < data.Length; ++i) 
    { 
     // Skip this field if it is marked NonSerialized. 
     if (Attribute.IsDefined(members[i], typeof(NonSerializedAttribute))) 
      continue; 

     FieldInfo field = (FieldInfo)members[i]; 
     if (field.FieldType.IsPrimitive) 
     { 
     } 
     else //TODO: What should I do here? 
    } 
    sw.Close(); 
} 

回答

1

如果遞歸你的意思是對象樹遍歷然後是,它給你當你實現自己的IFormatter。

簡單的檢查,如果該屬性的值不爲空,如果它正在實施IFormatter接口。如果是,那就調用它並使用它返回的值。 如果不是,那麼它又取決於你:你可能會拋出一個異常,說IFormatter必須被實現,或者只是退回到某種默認格式化程序(XML或Binary)。

遞歸本身是棘手的。當,讓我們說,對象引用本身,你需要足夠的智慧來處理這種情況,而不是與無限循環結束:

public class A { 
    public object SomeProperty { get; set; } 
} 
var a = new A(); 
a.SomeProperty = a; 

有在執行格式化了一些棘手的問題,像什麼如果兩個屬性實際上引用同一個對象?你會序列化/格式化它兩次或只是一次,並保持關於這些參考資料的信息? 如果你想只是單向系列化你並不可能需要這一點,但如果你希望能夠恢復的對象可能是重要的......