【问题标题】:Controlled serialization in .NET.NET 中的受控序列化
【发布时间】:2012-05-18 00:06:22
【问题描述】:

由于某些原因,我需要控制 .NET 中的对象序列化过程。我必须控制属性应该被序列化。这个过程应该是动态的,因此,在一个请求中,一组属性应该被序列化,而在另一个请求中——另一个。我很好奇是否可以通过已经存在的机制来实现或者我必须设计一些自定义序列化程序?

【问题讨论】:

    标签: .net serialization


    【解决方案1】:

    ISerializable 接口让您可以做到这一点。基本上,您可以控制在执行序列化时将哪些值添加到“属性包”(SerializationInfo)。请注意,您甚至不仅限于类型的属性,如下所示。

    public class StackOverflow_10639264
    {
        [Serializable]
        public class MyType : ISerializable
        {
            public string SerializedAM { get; set; }
            public string SerializedPM { get; set; }
            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                DateTime now = DateTime.Now;
                if (now.Hour < 12)
                {
                    info.AddValue("MyValue", this.SerializedAM);
                }
                else
                {
                    info.AddValue("MyValue", this.SerializedPM);
                    info.AddValue("NotAProperty", "Hello");
                }
            }
        }
        public static void Test()
        {
            MemoryStream ms = new MemoryStream();
            DataContractSerializer dcs = new DataContractSerializer(typeof(MyType));
            dcs.WriteObject(ms, new MyType { SerializedAM = "AM", SerializedPM = "PM" });
            Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
        }
    }
    

    【讨论】:

    • 感谢您的快速响应!看来这正是我所需要的!
    • 还有一个问题...如何在 GetObjectData 中传递我自己的参数?什么是好的做法?我需要传递一些对象来描述应该序列化的属性...
    • GetObjectData 是一个实例方法,因此它可以访问包含它的类型的所有成员(在上面的示例中,MyType)。如果要定义应该序列化的内容,可以将其存储在类型本身的某个字段/属性中。
    • 我想过......但如果我想序列化值数组(比如说 1000),我必须将此配置参数传递给 1000 个不同的对象......不喜欢它。现在考虑实现一些接口,该接口将从某个商店获取该配置参数。
    • 嗯...但是如果用 [DataContract] 而不是 [Serializable] 属性标记的类将如何工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多