你目前正处于脱机状态,正在等待 Internet 重新连接

FIX: 对象是不正确时序列化序列化和反序列化数据集对象,通过一个基于.net Framework 2.0 的应用程序中使用 SerializationFormat.Binary 格式参数

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 948646
症状
如果 Microsoft 基于.net Framework 2.0 的应用程序尝试序列化和反序列化 数据集 对象,通过使用 SerializationFormat.Binary 格式参数,对象是不正确地序列化。
原因
出现此问题是由于 System.Design.dll 文件中的错误。
解决方案

修补程序信息

现在可以从 Microsoft 获得支持的修补程序。但是,它被用于更正本文描述该问题。它仅应用于出现这一特定问题的系统。

若要解决此问题,请联系 Microsoft 客户支持服务以获取此修复程序。有关 Microsoft 客户支持服务电话号码和关于支持费用的信息的完整列表,请访问下面的 Microsoft 网站:注意 在特殊的情况中如果 Microsoft 支持专业人员确定某个特定更新才能解决您的问题,可能会被取消通常会导致支持电话的费用。将正常收取支持费用将应用于其他支持问题和不需要进行专门更新的问题。

系统必备组件

您必须具有要应用此修补程序安装.net Framework 2.0。

重新启动要求

您不必在应用此修补程序后,重新启动计算机。

修补程序替换信息

此修补程序不替代任何其他修补程序。

文件信息

此修补程序的英文版具有的文件属性 (或更新的文件属性) 在下表中列出。日期和时间对这些文件列出在协调世界时 (UTC)。当您查看文件信息时,将转换为本地时间。若要 UTC 与本地时间之间的时差使用控制面板中的 日期和时间 项中的 时区 选项卡。
文件的名称文件版本文件大小日期时间平台
System.design.dll2.0.50727.18155,046,2722008 年二月 27 日11: 47x86
状态
Microsoft 已经确认这是在"适用于"一节中列出的 Microsoft 产品中的问题。

重现此问题的步骤

  1. 创建一个新的控制台应用程序,该应用程序被命名为"ConsoleAppTestDTset。
  2. 创建新的数据集项名为"DsTest.xsd。
  3. 添加数据表类型表名为"dtTest。
  4. 添加两个名为 col1 和 col2 到表的列。请确保每个列的数据类型被设置为 System.Int32
  5. 设置为"col 2"的下列表达式:
    col1 * 2
  6. 在主方法中插入以下代码:
    static void Main(string[] args)        {            // Create a dataset instance.            DataSet ds = new DsTest();            // Add a row.            ds.Tables["dtTest"].Rows.Add(1);            ds.Tables["dtTest"].Rows.Add(2);            ds.Tables["dtTest"].Rows.Add(3);            // Show rows to see that the expression works            foreach (DataRow dr in ds.Tables["dtTest"].Rows)            {                Console.WriteLine("col1: {0}, col2: {1}", dr[0], dr[1]);            }            Console.WriteLine("Expression = " + ds.Tables["dtTest"].Columns["col2"].Expression);            Console.WriteLine();            // Do the serialization or the deserialization.            byte[] serializedDS;            ds.SchemaSerializationMode = SchemaSerializationMode.ExcludeSchema;            // Using SerializationFormat.Binary fails.            ds.RemotingFormat = SerializationFormat.Binary;            // Using SerializationFormat.Xml works.            //ds.RemotingFormat = SerializationFormat.Xml;                        // Serialize.            MemoryStream ms = new MemoryStream();            BinaryFormatter bf = new BinaryFormatter();            bf.Serialize(ms, ds);            serializedDS = ms.ToArray();            // Deserialize.            ms.Write(serializedDS, 0, serializedDS.Length);                                     ms.Position = 0;            DataSet newDs = (DataSet)bf.Deserialize(ms);            // Display the deserialized dataset.            foreach (DataRow dr in newDs.Tables["dtTest"].Rows)            {                Console.WriteLine("col1: {0}, col2: {1}", dr[0], dr[1]);            }            Console.WriteLine("Expression = " + newDs.Tables["dtTest"].Columns["col2"].Expression);            Console.WriteLine();            Console.WriteLine("Done..!");            Console.Read();        }
    When you run the application, the expression string is not displayed in the Output Window as expected.
  7. DsTest.Designer.cs 文件中找到下面的代码:
    [System.Diagnostics.DebuggerNonUserCodeAttribute()]protected DsTest(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context, false) {   if ((this.IsBinarySerialized(info, context) == true))    {      this.InitVars(false);         System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);         this.Tables.CollectionChanged += schemaChangedHandler1;         this.Relations.CollectionChanged += schemaChangedHandler1;         return;   }...
  8. 使用下面的代码替换此代码:
    [System.Diagnostics.DebuggerNonUserCodeAttribute()]protected DsTest(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context, false) {   if ((this.IsBinarySerialized(info, context) == true))    {      this.InitVars(false);         System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);         this.Tables.CollectionChanged += schemaChangedHandler1;         this.Relations.CollectionChanged += schemaChangedHandler1;       // These two lines are the only new ones.      if ((this.DetermineSchemaSerializationMode(info, context) == System.Data.SchemaSerializationMode.ExcludeSchema))               this.InitExpressions();       return;   }...
    时保存,并重新运行应用程序输出窗口中显示表达式字符串。
注意如果您修改 DataSet 对象,并重新生成应用程序然后在第 8 步中添加的代码就会消失。

二进制序列化的 DataSet 对象有关的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:有关软件更新术语的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
824684用于描述 Microsoft 软件更新的标准术语的说明
数据集 VS 2005 序列化 SerializationFormat ExcludeSchema 表达式 MSDataSetGenerator InitExpressions

警告:本文已自动翻译

属性

文章 ID:948646 - 上次审阅时间:04/15/2008 16:14:48 - 修订版本: 1.0

Microsoft .NET Framework 2.0

  • kbmt kbpubtypekc kbqfe kbhotfixserver kbexpertiseadvanced KB948646 KbMtzh
反馈