我有以下代码:
[Serializable]
public class CustomClass
{
public CustomClass()
{
this.Init();
}
public void Init()
{
foreach (PropertyInfo p in this.GetType().GetProperties())
{
DescriptionAttribute da = null;
DefaultValueAttribute dv = null;
foreach (Attribute attr in p.GetCustomAttributes(true))
{
if (attr is DescriptionAttribute)
{
da = (DescriptionAttribute) attr;
}
if (attr is DefaultValueAttribute)
{
dv = (DefaultValueAttribute) attr;
}
}
UInt32 value = 0;
if (da != null && !String.IsNullOrEmpty(da.Description))
{
value = Factory.Instance.SelectByCode(da.Description, 3);
}
if (dv != null && value == 0)
{
value = (UInt32) dv.Value;
}
p.SetValue(this, value, null);
}
}
private UInt32 name;
[Description("name")]
[DefaultValue(41)]
public UInt32 Name
{
get { return this.name; }
set { this.name = value; }
}
(30 more properties)
}
现在奇怪的是:当我尝试序列化这个类时,我会得到一个空节点 CustomClass!
<CustomClass />
当我从构造函数中删除 Init 时,它按预期工作!我将获得该类的完整 xml 表示,但当然没有值(所有值都为 0)。
<CustomClass>
<Name>0</Name>
...
</CustomClass>
此外,当我注释掉 Init 的主体时,我会得到与上面相同的结果(具有默认值的那个)我已经尝试过使用公共方法,使用 Helper 类,但它不起作用。也就是说,而不是预期的:
<CustomClass>
<Name>15</Name>
...
</CustomClass>
我会得到
<CustomClass />
似乎当我在这个类中使用反射时,序列化是不可能的。或者总结一下:当我调用 Init 或当我用反射填充我的属性时 -> 序列化失败,当我删除此代码部分时 -> 序列化工作但当然没有我的值。
这是真的?有人知道我的解决方案的替代方案吗?
它应该根据描述自动从数据库中获取一些东西,当它什么都不返回时,它会回退到 DefaultValue...
PS1:我正在使用 XmlSerializer
PS2:当我在序列化之前设置断点时,我可以看到所有属性都填充了好的值(如 71、72 等)。