我创建了一个非常简单的控件,其中包含过滤器选项控件列表,其方式与listbox具有listitems列表的方式大致相同。无法xml序列化自定义对象
我有一些麻烦tring让它序列化到视图状态,因为序列化程序似乎试图序列化基类属性,基本上我最终会出现像 - 无法序列化属性“页”的错误你是什么想想是我的问题?
验证码:
[Serializable]
public class FilterOption : Control, ISerializable
{
public event EventHandler Checkchanged;
CheckBox _chk = new CheckBox();
Label _lbl = new Label();
public string Text
{
get { return _lbl.Text; }
set { _lbl.Text = value; }
}
public bool Checked
{
get { return _chk.Checked; }
set { _chk.Checked = value; }
}
public FilterOption()
{
Controls.Add(new LiteralControl("<li>"));
_chk.AutoPostBack = true;
_chk.CssClass = "checkbox";
Controls.Add(_chk);
Controls.Add(_lbl);
_chk.CheckedChanged += new EventHandler(_chk_CheckedChanged);
Controls.Add(new LiteralControl("</li>"));
}
public FilterOption(string Text, bool Checked)
{
Controls.Add(new LiteralControl("<li>"));
_chk.CssClass = "checkbox";
_lbl.Text = Text;
_chk.Checked = Checked;
Controls.Add(_chk);
Controls.Add(_lbl);
_chk.CheckedChanged += new EventHandler(_chk_CheckedChanged);
Controls.Add(new LiteralControl("</li>"));
}
public FilterOption(SerializationInfo info, StreamingContext context)
{
Controls.Add(new LiteralControl("<li>"));
_chk.CssClass = "checkbox";
_lbl.Text = (string)info.GetValue("Text", typeof(string));
_chk.Checked = (bool)info.GetValue("Text", typeof(bool));
Controls.Add(_chk);
Controls.Add(_lbl);
_chk.CheckedChanged += new EventHandler(_chk_CheckedChanged);
Controls.Add(new LiteralControl("</li>"));
}
void _chk_CheckedChanged(object sender, EventArgs e)
{
if (Checkchanged != null)
Checkchanged(this, new EventArgs());
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
if(info == null)
throw new System.ArgumentNullException("info");
info.AddValue("Text", _lbl.Text);
info.AddValue("Checked", _chk.Checked);
}
}
我真的只需要序列化的属性添加到GetObjectData方法序列化信息。
我用下面的代码来执行序列...
List<FilterOption> options = new List<FilterOption>();
... add some items to the collection ...
StringWriter writer = new StringWriter();
XmlSerializer ser = new XmlSerializer(typeof(List<FilterOption>));
ser.Serialize(writer, options);
ViewState["Options"] = writer.ToString();
哦叶......我忘了补充...我得到从这里的信息... http://msdn.microsoft.com/en-us/library/ms973893.aspx
(如果它事项)
...
THX Wardy
那是永远正确的肯定......不是实施ISerializable接口的点...所以你放什么东西到系列化信息忽略enything是序列化是不能被序列化? ......如果你所说的事实上是真的,那么ISerializable接口有什么意义呢? – War 2011-05-10 09:41:15
虽然我看到你的观点...控件不可序列化...我将自定义控件标记为可序列化,然后实现ISerlializable以确保我只序列化可以序列化的属性值(在这种情况下,为字符串和布尔值)...实际控制本身和基类属性不应该被序列化...还是我错过了什么? – War 2011-05-10 09:51:13