Использование SoapFormatter для сериализации селективных свойств класса - PullRequest
0 голосов
/ 30 ноября 2009

Привет, мне нужно сериализовать несколько полей моего класса

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 Ответ

3 голосов
/ 30 ноября 2009

Отметьте поля, которые вы не хотите сериализовать, с помощью [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
}
...