如何防止数据管理序列化

时间:2011-11-04 14:22:43

标签: c# serialization

我只想要对某个数据成员进行反序列化,而不进行序列化。

我知道我可以设置EmitDefaultValue = false,并将值设置为null。

但我也不想改变数据库的值,有没有其他方法可以实现这个目标?

序列化程序是DataContractSerializer。 :)

感谢。

5 个答案:

答案 0 :(得分:7)

您可以在序列化之前更改数据成员的值(到默认值,因此它不会被序列化),但在序列化之后您将更改它 - 使用[OnSerializing][OnSerialized]回调(this blog post中的更多信息)。只要您没有多个线程同时序列化对象,这就可以正常工作。

public class StackOverflow_8010677
{
    [DataContract(Name = "Person", Namespace = "")]
    public class Person
    {
        [DataMember]
        public string Name;
        [DataMember(EmitDefaultValue = false)]
        public int Age;

        private int ageSaved;
        [OnSerializing]
        void OnSerializing(StreamingContext context)
        {
            this.ageSaved = this.Age;
            this.Age = default(int); // will not be serialized
        }
        [OnSerialized]
        void OnSerialized(StreamingContext context)
        {
            this.Age = this.ageSaved;
        }

        public override string ToString()
        {
            return string.Format("Person[Name={0},Age={1}]", this.Name, this.Age);
        }
    }

    public static void Test()
    {
        Person p1 = new Person { Name = "Jane Roe", Age = 23 };
        MemoryStream ms = new MemoryStream();
        DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
        Console.WriteLine("Serializing: {0}", p1);
        dcs.WriteObject(ms, p1);
        Console.WriteLine("   ==> {0}", Encoding.UTF8.GetString(ms.ToArray()));
        Console.WriteLine("   ==> After serialization: {0}", p1);
        Console.WriteLine();
        Console.WriteLine("Deserializing a XML which contains the Age member");
        const string XML = "<Person><Age>33</Age><Name>John Doe</Name></Person>";
        Person p2 = (Person)dcs.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(XML)));
        Console.WriteLine("  ==> {0}", p2);
    }
}

答案 1 :(得分:4)

哪个序列化程序?如果是XmlSerializer那么:

public int Foo {get;set;}
[XmlIgnore]
public bool FooSpecified {
    get { return false; } // never serialize
    set { }
}

public int Foo {get;set;}
public bool ShouldSerializeFoo() { return false; }

会这样做。但是,快速测试显示这对DataContractSerializer不起作用。 protobuf-net也支持这两种信息。

答案 2 :(得分:1)

您是否尝试使用[IgnoreDataMember]装饰房产?

答案 3 :(得分:0)

有一个属性System.Xml.Serialization.XmlIgnoreAttribute告诉xmkserializers忽略你的属性。但它只会改变xml序列化行为。

答案 4 :(得分:0)

添加IgnoreDataMemberAttribute