CSDN-CSDN社区-.NET技术-ASP.NET

收藏 将 WebForm 页面上的所有用户控件序列化的问题[问题点数:200,结帖人:shove]

  • shove
  • (shove)
  • 等 级:
  • 结帖率:
楼主发表于:2009-01-09 22:34:46
我这样写,生成了文件。但是结果不正确。

        IFormatter formatter = new BinaryFormatter();
        Stream stream = null;

        try
        {
            stream = new FileStream("e:\\aaaa.txt", FileMode.Create, FileAccess.Write, FileShare.None);

            formatter.Serialize(stream, this.Controls);
        }
        catch
        {
        }
        finally
        {
            if (stream != null)
            {
                stream.Close();
            }
        }


请问各位大侠,这样该怎样实现呢?
回复次数:19
#1楼 得分:5回复于:2009-01-09 22:50:24
将控件序列化 不明白 学习
  • yeness用户头像
  • yeness
  • (请输入你的社区昵称)
  • 等 级:
#2楼 得分:5回复于:2009-01-09 22:59:05
不明白
  • sp1234用户头像
  • sp1234
  • (龙芯偷盗8年终于“合理”购买了)
  • 等 级:
#3楼 得分:100回复于:2009-01-09 23:11:46
#4楼 得分:5回复于:2009-01-10 00:05:18
引用 3 楼 sp1234 的回复:
有太多的问题。就算可以序列化/反序列化出来的东西也不是原来的等价功能的东西(有太多的东西都会运行时垮掉)。

你应该多探索一些深度,再创意。例如当你序列化、反序列的时候,你知道事件序列化和反序列之后的后果是什么吗?不知道,应该自己写一个(不是asp.net控件)程序试试开发一个简化的代码,从简单的做起。


我关注你很久了...
  • sp1234用户头像
  • sp1234
  • (龙芯偷盗8年终于“合理”购买了)
  • 等 级:
#5楼 得分:35回复于:2009-01-10 00:34:28
  • shove用户头像
  • shove
  • (shove)
  • 等 级:
#6楼 得分:0回复于:2009-01-10 09:05:03
sp1234 大侠说得很有理。
看来这种方法行不通了。

其实我的需求是这样的:

public class PageBase : System.Web.UI.Page
{
    protected override void OnLoad(EventArgs e)
    {
        // 这里按需要装载了好多 UserControl。
        // this.Form.Controls.Add(N 个);
    }
}

public partial class _Default : PageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

因为 PageBase 的 OnLoad 中的装载时还有一些比较复杂的代码,很消耗 CPU 资源, 而且发现这个方法每次都是执行 2 次!
弄了好久没有找到如何让他不装载 2 次的办法。

所以才朝如题这种方面想了。

请 sp1234 及各位大侠支招,谢谢!!
  • KimmKing用户头像
  • KimmKing
  • (秦风意动(qsoft开源工作室)
  • 等 级:
#7楼 得分:30回复于:2009-01-10 09:21:54
  • KimmKing用户头像
  • KimmKing
  • (秦风意动(qsoft开源工作室)
  • 等 级:
#8楼 得分:5回复于:2009-01-10 09:23:25
C# code
而且发现这个方法每次都是执行 2!


你没有判断page的postback


ps:
viewstate的原理就差不多是“序列化”。
  • ynw506用户头像
  • ynw506
  • (我要学坏,谁教我?)
  • 等 级:
#9楼 得分:5回复于:2009-01-10 09:23:25
mark~~
  • shove用户头像
  • shove
  • (shove)
  • 等 级:
#10楼 得分:0回复于:2009-01-10 10:11:48
引用 8 楼 KimmKing 的回复:
C# code而且发现这个方法每次都是执行 2 次!


你没有判断page的postback


ps:
viewstate的原理就差不多是“序列化”。



8楼把问题看简单了。

无论是:

if (!IsPostBack)
{
    // 装载
}

还是
if (IsPostBack)
{
    // 装载
}


经检验,都是执行 2 次。
这里的代码本来就消耗 CPU,多执行一次就更不得了。

请高手赐教。
  • KimmKing用户头像
  • KimmKing
  • (秦风意动(qsoft开源工作室)
  • 等 级:
#11楼 得分:0回复于:2009-01-10 10:17:00
引用 10 楼 shove 的回复:
引用 8 楼 KimmKing 的回复:
C# code而且发现这个方法每次都是执行 2 次!


你没有判断page的postback


ps:
viewstate的原理就差不多是“序列化”。



8楼把问题看简单了。

无论是:

if (!IsPostBack)
{
    // 装载
}

还是
if (IsPostBack)
{
    // 装载
}


经检验,都是执行 2 次。
这里的代码本来就消耗 CPU,多执行一次就更不得了。

请高手赐教。


这个判断是在Base里的?
  • KimmKing用户头像
  • KimmKing
  • (秦风意动(qsoft开源工作室)
  • 等 级:
#12楼 得分:0回复于:2009-01-10 10:18:26
一次request不可能调用两次,
只有回传还会load,区分开,绝不会掉两次
  • shove用户头像
  • shove
  • (shove)
  • 等 级:
#13楼 得分:0回复于:2009-01-10 10:21:07
刚检验,

public class PageBase : System.Web.UI.Page
{
    protected override void OnLoad(EventArgs e)
    {
        // 写当前时间到一个文本文件
    }
}

public partial class _Default : PageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

这样,打开网页,写入一次。刷新一下,写入一次。  这样还起来完全正常。

但是:
当把
public class PageBase : System.Web.UI.Page
{
    protected override void OnLoad(EventArgs e)
    {
        // 写当前时间到一个文本文件
    }
}
这个放在另外一个项目,编译成 dll,
情况就不一样了,

每次一打开网页,就运行了 2 次,刷新一下页面,又写了 2 次。

很是奇怪。

哪位大侠把机制讲解一下。
#14楼 得分:5回复于:2009-01-10 11:17:58
学习
  • KimmKing用户头像
  • KimmKing
  • (秦风意动(qsoft开源工作室)
  • 等 级:
#15楼 得分:0回复于:2009-01-10 11:55:47
两次的问题,可以尝试的方法:
1、检查设计器里的代码,是不是注册了两次
2、清空vs的缓存,清理,重新编译,运行


还不行的话,没办法了,
当年,慕白兄和思归都没搞定:
http://topic.csdn.net/t/20041210/15/3634069.html
#16楼 得分:5回复于:2009-01-13 15:47:46
友情up
  • shove用户头像
  • shove
  • (shove)
  • 等 级:
#17楼 得分:0回复于:2009-01-13 18:15:58
谢谢各位,问题解决:

页面上有一个用户控件,用户控件使用了 Ajax。

Ajax 执行了一次页面的 OnLoad。
  • shove用户头像
  • shove
  • (shove)
  • 等 级:
#18楼 得分:0回复于:2009-01-14 08:24:28
为了不给大家造成误导,特修正我自己在 17 楼的错误:

1、经晚上仔细研究,不是 Ajax 执行了一次 OnLoad
2、是页面上的自定义用户控件造成的。

    现象:Web自定义用户控件,如果不重写 Render 方法,则不会造成 OnLoad 2 次执行,如果 protected override void Render(HtmlTextWriter output) 改写这个方法,则会造成 OnLoad 2 次执行。
          与 IsPostBack 无关。
  • shove用户头像
  • shove
  • (shove)
  • 等 级:
#19楼 得分:0回复于:2009-01-15 15:00:38
罪魁祸首是:

<img src="" .... />

当页面上出现了 src=""  空串时,
Page_Load、 OnLoad、 Init 等等都执行 2 次。

我上面说的那个控件中出现了这个,所以导致执行 2 次。

而该Web自定义用户控件如果不重写 Render, 用自己默认的方法,就不会。

--------------------------------------------------

总之, <img src=""    换为  <img src="about:blank"    就没有任何问题了。
相关问题
最近也在找工作,整理一些面试遇到的题目,大家一起做做! .NET技术 ...