none
linq对象如何序列化?? RRS feed

  • 问题

  • 我在O/R中设置序列化模式为单向模式。生成的对象代码如下:

    [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.sys_Admin")]
    [global::System.Runtime.Serialization.DataContractAttribute()]
     public partial class sys_Admin : INotifyPropertyChanging, INotifyPropertyChanged
     {
      
      private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
      
      private int _adminId;
      
      private string _adminName;
      
        #region 可扩展性方法定义
        partial void OnLoaded();
        partial void OnValidate(System.Data.Linq.ChangeAction action);
        partial void OnCreated();
        partial void OnadminIdChanging(int value);
        partial void OnadminIdChanged();
        partial void OnadminNameChanging(string value);
        partial void OnadminNameChanged();
        #endregion
      
      public sys_Admin()
      {
       this.Initialize();
      }
      
      [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_adminId", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
      [global::System.Runtime.Serialization.DataMemberAttribute(Order=1)]
      public int adminId
      {
       get
       {
        return this._adminId;
       }
       set
       {
        if ((this._adminId != value))
        {
         this.OnadminIdChanging(value);
         this.SendPropertyChanging();
         this._adminId = value;
         this.SendPropertyChanged("adminId");
         this.OnadminIdChanged();
        }
       }
      }
      
      [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_adminName", DbType="NVarChar(50) NOT NULL", CanBeNull=false)]
      [global::System.Runtime.Serialization.DataMemberAttribute(Order=2)]
      public string adminName
      {
       get
       {
        return this._adminName;
       }
       set
       {
        if ((this._adminName != value))
        {
         this.OnadminNameChanging(value);
         this.SendPropertyChanging();
         this._adminName = value;
         this.SendPropertyChanged("adminName");
         this.OnadminNameChanged();
        }
       }
      }
      
      public event PropertyChangingEventHandler PropertyChanging;
      
      public event PropertyChangedEventHandler PropertyChanged;
      
      protected virtual void SendPropertyChanging()
      {
       if ((this.PropertyChanging != null))
       {
        this.PropertyChanging(this, emptyChangingEventArgs);
       }
      }
      
      protected virtual void SendPropertyChanged(String propertyName)
      {
       if ((this.PropertyChanged != null))
       {
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
       }
      }
      
      private void Initialize()
      {
       OnCreated();
      }
      
      [global::System.Runtime.Serialization.OnDeserializingAttribute()]
      [global::System.ComponentModel.EditorBrowsableAttribute(EditorBrowsableState.Never)]
      public void OnDeserializing(StreamingContext context)
      {
       this.Initialize();
      }
     }
    }

    从代码中可以看出,类和属性分别已经标识上序列化所需的属性。

    DA层的查询语句如下:

     public List<sys_Admin> List()
            {
                return db.sys_Admin.ToList();
            }

    在WEB层的使用如下:

     DA_sys_Admin adminDA = new DA_sys_Admin();
     ViewState["admin"] = adminDA.List();

    但是调用出错:

    程序集“TestWeb.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“TestWeb.Model.sys_Admin”未标记为可序列化。

    请问我该如何才能序列化成功呢!!!

    2010年11月30日 13:45

答案

  • Session 不需要序列化即可取回,但 ViewState 因為要寫入 HTTP 輸出,所以一定要標記可序列化。
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    目前籌建雲端運算學堂 (studyazure.com) 中...
    • 已标记为答案 Mog Liang 2010年12月7日 5:59
    2010年12月1日 4:12

全部回复

  • 我在设置序列化模式为单向模式。生成的对象代码如下:

    [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.sys_Admin")]
     [global::System.Runtime.Serialization.DataContractAttribute()]
     public partial class sys_Admin : INotifyPropertyChanging, INotifyPropertyChanged
     {
      
      private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
      
      private int _adminId;
      
      private string _adminName;
      
        #region 可扩展性方法定义
        partial void OnLoaded();
        partial void OnValidate(System.Data.Linq.ChangeAction action);
        partial void OnCreated();
        partial void OnadminIdChanging(int value);
        partial void OnadminIdChanged();
        partial void OnadminNameChanging(string value);
        partial void OnadminNameChanged();
        #endregion
      
      public sys_Admin()
      {
       this.Initialize();
      }
      
      [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_adminId", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
      [global::System.Runtime.Serialization.DataMemberAttribute(Order=1)]
      public int adminId
      {
       get
       {
        return this._adminId;
       }
       set
       {
        if ((this._adminId != value))
        {
         this.OnadminIdChanging(value);
         this.SendPropertyChanging();
         this._adminId = value;
         this.SendPropertyChanged("adminId");
         this.OnadminIdChanged();
        }
       }
      }
      
      [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_adminName", DbType="NVarChar(50) NOT NULL", CanBeNull=false)]
      [global::System.Runtime.Serialization.DataMemberAttribute(Order=2)]
      public string adminName
      {
       get
       {
        return this._adminName;
       }
       set
       {
        if ((this._adminName != value))
        {
         this.OnadminNameChanging(value);
         this.SendPropertyChanging();
         this._adminName = value;
         this.SendPropertyChanged("adminName");
         this.OnadminNameChanged();
        }
       }
      }
      
      public event PropertyChangingEventHandler PropertyChanging;
      
      public event PropertyChangedEventHandler PropertyChanged;
      
      protected virtual void SendPropertyChanging()
      {
       if ((this.PropertyChanging != null))
       {
        this.PropertyChanging(this, emptyChangingEventArgs);
       }
      }
      
      protected virtual void SendPropertyChanged(String propertyName)
      {
       if ((this.PropertyChanged != null))
       {
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
       }
      }
      
      private void Initialize()
      {
       OnCreated();
      }
      
      [global::System.Runtime.Serialization.OnDeserializingAttribute()]
      [global::System.ComponentModel.EditorBrowsableAttribute(EditorBrowsableState.Never)]
      public void OnDeserializing(StreamingContext context)
      {
       this.Initialize();
      }
     }
    }

    从代码中可以看出,类和属性分别已经标识上序列化所需的属性。

    DA层的查询语句如下:

     public List<sys_Admin> List()
            {
                return db.sys_Admin.ToList();
            }

    在WEB层的使用如下:

     DA_sys_Admin adminDA = new DA_sys_Admin();
     ViewState["admin"] = adminDA.List();

    但是调用出错:

    程序集“TestWeb.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“TestWeb.Model.sys_Admin”未标记为可序列化。

    请问我该如何才能序列化成功呢!!!


    刚刚发现了一个很奇怪的问题。用Session["admin"] = adminDA.List();是可以的。为何用ViewState不行呢?
    2010年11月30日 13:56
  • Session 不需要序列化即可取回,但 ViewState 因為要寫入 HTTP 輸出,所以一定要標記可序列化。
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    目前籌建雲端運算學堂 (studyazure.com) 中...
    • 已标记为答案 Mog Liang 2010年12月7日 5:59
    2010年12月1日 4:12
  • 在linq的实体上加入可序列化的特性
    2010年12月1日 13:09