【问题标题】:Set a default value to a property and make it serializable为属性设置默认值并使其可序列化
【发布时间】:2011-03-22 22:04:37
【问题描述】:

我需要为属性设置一个默认值,但我不能这样做:

private int prop = 1;

public Prop
{
     get { return prop;} ...
}

因为我需要序列化这个类,如果我这样做,我会失去默认值。

您是否知道在序列化之后和之前向属性添加属性的任何解决方案?

我正在使用带有框架 3.5 的 c#。

【问题讨论】:

    标签: c# .net properties default serializable


    【解决方案1】:

    DefaultValueAttribute

    [DefaultValue("SomeValue")]
    public string Prop { get; set; }
    

    你可以在这里阅读很多关于序列化的内容:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

    【讨论】:

    • DefaultValue 属性是告诉属性页这是一个属性所期望的默认值,也许我的问题是错误的,我需要设置“初始值”并在序列化后保留这个值.在您的示例代码中,如果我询问 Prop 的值,我会得到 string.Empty,而不是“SomeValue”。
    • 我误解了你的问题。改为查看 OnSerializingAttribute。
    • 是的,我想我需要使用 OnSerializationAttribute,谢谢
    【解决方案2】:

    还有:

        ''' <summary>
        ''' The defaults size for the list item.
        ''' </summary>
    ''' <value>Size.</value>
    ''' <returns>Size.</returns>
    ''' <remarks></remarks>
    <Category("Appearance")> _
    <Description("The defaults size for the list item.")> _
      Public Property DefaultItemSize() As Size Implements IVisualList.DefaultItemSize
        Get
            Return m_DefaultItemSize
        End Get
        Set(ByVal value As Size)
            m_DefaultItemSize = value
        End Set
    End Property
    
    Protected Overridable Function ShouldSerializeDefaultItemSize() As Boolean
        If m_DefaultItemSize.Equals(New Size(100, m_CellHeight)) Then Return False
        Return True
    End Function
    

    另一种选择可能是使用这些属性:

    [OnSerializing()]

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

    [OnDeserializing()]

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

    【讨论】:

    • 我不能使用自定义序列化器。这个想法是创建一个实体类,其中包含有关约束和其他内容的信息。例如。我需要创建一个名为“Person”的实体类,并带有一个“name”属性。在另一个属性上(例如 name_MaxLength”,我想为“name”属性指定最大长度并将此属性用于 UI、业务规则、验证器、存储过程的动态创建......但是,当我使用这个带有网络服务的实体我失去了初始值,因为我只有实体类的架构,我没有实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多