代码之家  ›  专栏  ›  技术社区  ›  Xavier Poinas

将[Serializable]更改为[DataContract]

  •  2
  • Xavier Poinas  · 技术社区  · 14 年前

    我有一组使用 [Serializable] [DataContract] 属性。它只在可序列化的情况下工作,但是属性会得到有趣的名称,比如…k_uubackingfield。

    这些类也在其他地方使用,我想知道替换属性是否会破坏任何东西。而且,这是可能的,这是一个好主意,他们都有?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Josh    14 年前

    当您只指定DataContractAttribute,而不指定要包含的成员的特定属性时,默认行为是序列化类的所有字段,包括私有字段。所以你得到的名字是因为你使用的是自动实现的属性,我猜。

    换句话说,将类定义更改为如下所示。注意我想要序列化的属性上的DataMember属性。

    [DataContract]
    public class MyClass {
    
        [DataMember]
        public string SomeString {
            get;
            set;
        }
    
        [DataMember]
        public int SomeInt {
            get;
            set;
        }
    
        public string DontSerializeThis {
            get;
            set;
        }
    
    }
    

    这将导致DataContractSerializer序列化 而不是编译器生成的支持字段。但是,它确实要求属性是读/写公共属性,因为它将通过这些属性访问器来获取和设置序列化数据。

    另一个选项是将自动实现的属性更改为“普通”属性,这意味着添加自己的备份字段。然后您可以关闭所有DataMember属性,这意味着它们都将被序列化,或者您可以将DataMember属性添加到您创建的新字段中,这样您就可以根据需要在序列化输出中重命名它们。

    最后,谈谈让一个类在两个系统中都可以序列化是不是一个好主意。如果希望类使用BinaryFormatter或XmlSerializer之类的东西参与经典序列化,那么应该只针对该场景,因为DataContractSerializer已经可以序列化这些类了。

    如果您的目标是快速、高效的.NET3+到.NET3+(或Silverlight)的通信,那么DataContract就是一个不错的选择。如果您的目标是互操作性和/或对XML表示的控制,请坚持使用XML序列化属性。

        2
  •  0
  •   No answer    11 年前

    public string DontSerializeThis {
        get;
        set;
    }
    

    由于同一答案中提到的默认行为,将导致一个备份字段被序列化的属性。应该是的

    [IgnoreDataMember]
    public string DontSerializeThis {
        get;
        set;
    }
    

    http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ignoredatamemberattribute.aspx