2009-11-30 68 views
0

嗨的選擇性能我需要序列化我班的幾個領域使用SoapFormatter序列化類

class Foo 
{ 
Guid value1; 
decimal value2; 
SomeCustomEnum value3; 
} 

我可以序列各領域逐一:

你做
  MemoryStream ms = new MemoryStream(); 
      SoapFormatter sf = new SoapFormatter(); 
      sf.Serialize(ms,value1; 
      sf.Serialize(ms, value2); 
      sf.Serialize(ms, value3); 
      string data = Convert.ToBase64String(ms.ToArray()); 
      ms.Close(); 
+1

如果你這樣做,你會得到幾個SOAP信封/消息在彼此之後。你想完成什麼? – 2009-11-30 17:13:43

+0

我需要將所有類成員粘貼到一個字符串中。我明白你的意思,這不是我想要的。 – 2009-11-30 18:39:33

+1

爲什麼你不能序列化全班? – 2009-11-30 19:34:26

回答

3

馬克領域不想序列化爲[NonSerialized]。這樣你可以跳過第三方領域。

[Serializable] 
    class Foo 
    { 
     Guid value1; 
     decimal value2; 
     SomeCustomEnum value3; 

     [NonSerialized] 
     int Skip = 12; 
    } 

[編輯] 有關繼承的評論後,新的例子。你可以手動控制你的序列化:

class Foo 
{ 
    public Guid value1; 
    public decimal value2; 
    public SomeCustomEnum value3; 
} 

[Serializable] 
class Bar : Foo, ISerializable 
{ 
    private int a; 

    public Bar() 
    { 
    } 

    #region Implementation of ISerializable 
    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("a", a); 
     info.AddValue("value1", value1); 
     info.AddValue("value2", value2); 
    } 

    protected Bar(SerializationInfo info,StreamingContext context) 
    { 
     a = info.GetInt32("a"); 
     value1 = (Guid)info.GetValue("value1", typeof(Guid)); 
     value2 = info.GetDecimal("value2"); 
    } 
    #endregion 
} 
+0

好主意。但是如果我的課程是從不是市場的第三方課程序列化而來的? – 2009-12-01 10:49:43

+1

在我添加的例子中,如果你不想手工製作它,你可能會用反射來遍歷所有的屬性。 – 2009-12-01 16:29:21