在序列化上调用GetObjectData

时间:2009-03-03 14:20:40

标签: c# .net serialization

我对来自MSDN的序列化样本感到困惑。

我的困惑在于GetObjectData方法(在序列化期间调用),方法是

  1. 序列化其他数据(来自AddValue的方法GetObjectData)和类的字段/属性;
  2. 或者只是在方法GetObjectData中写入数据而不编写类的字段/属性?
  3. 我调试似乎(2)是正确的 - 如果使用GetObjectData方法,没有字段/属性数据被序列化?那是对的吗? (我不是专家,只想在这里确认,但对自己100%有信心。)

3 个答案:

答案 0 :(得分:2)

如果您实施ISerializable,则您对所有数据(即问题中的情景“2”)负有责任;没有额外的自动序列化。你的要求是什么?像DataContractSerializer这样的东西可以基于属性,允许你装饰常规字段你的自定义属性(有一些逻辑)并正确地序列化它们。如果你需要二进制(用于空间等),那么可能会考虑像protobuf-net这样的东西,它们在节省空间的同时将它们混合在一起。

那么:你的要求是什么?

数据合同示例:

[DataContract]
public class Foo {
    [DataMember]
    public int Bar {get;set;} // simple data

    [DataMember]
    private string DoSomeThinking {
        get {.... serialize the complex data ....}
        set {.... deserialize the complex data ....}
    }
}

答案 1 :(得分:2)

如果实现ISerializable,则必须使用AddValue将所有数据(至少包括反序列化所需的数据)添加到SerializationInfo中。

答案 2 :(得分:2)

我不确定你想要实现什么,但让C#为你做的工作并不容易:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

namespace Test
{
    [Serializable]
    public class TestObject
    {
        private String name;
        private String note;
        #region Getters/setters

        public String Name
        {
            get { return name; }
            set { name = value; }
        }

        public String Note
        {
            get { return note; }
            set { note = value; }
        }
        #endregion
    }
}

现在您可以使用XmlSerializer或BinaryFormatter来(de)序列化对象