Исправление: Объекты не сериализованы правильно при сериализации и десериализации объектов DataSet с помощью параметра format SerializationFormat.Binary в приложениях .NET Framework 2.0

Переводы статьи Переводы статьи
Код статьи: 948646 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Проблема

Если приложение на основе .NET Framework 2.0 Microsoft пытается использовать для сериализации и десериализацииНабор данныхобъекты с помощьюSerializationFormat.BinaryФормат параметра, объекты не сериализованы правильно.

Причина

Данная проблема возникает из-за ошибки в файле System.Design.dll.

Решение

Сведения об исправлении

Эта проблема может быть решена с помощью исправления, специально выпущенного корпорацией Майкрософт.. Оно должно применяться только в системах, в которых наблюдается описанная выше проблема.. Предлагаемое исправление должно применяться исключительно в системах, где наблюдается описанная проблема..

Чтобы получить исправление и решить проблему, свяжитесь со службами технической поддержки Майкрософт.. Полный список телефонов службы поддержки пользователей корпорации Майкрософт и сведения о стоимости поддержки посетите следующий веб-узел корпорации Майкрософт:
http://support.microsoft.com/contactus/?ws=support
Примечание.В отдельных случаях, если специалистом службы технической поддержки Майкрософт будет определено, что решением проблемы является специально выпущенное исправление, оплата, предусмотренная за обращение в службы технической поддержки, может быть отменена.. Дополнительные услуги по технической поддержке, не связанные с данным исправлением, оплачиваются на стандартных условиях..

Предвартельные требования

Необходимо установить это исправление .NET Framework 2.0.

Необходимость перезагрузки

После установки исправления перезагружать компьютер не требуется..

Сведения о заменяемых исправлениях

Это исправление не заменяет других исправлений..

СВЕДЕНИЯ О ФАЙЛАХ

Английская версия исправления содержит версии файлов, приведенные в следующей таблице (или более поздние).. Дата и время для файлов указаны во всеобщем скоординированном времени (UTC).. При просмотре сведений о файле, время изменяется на местное.. Чтобы узнать разницу между временем по Гринвичу и местным временем,Часовой поясна вкладкеДата и времяэлемент панели управления.
Свернуть эту таблицуРазвернуть эту таблицу
Имя файлаВерсия файлаРазмер файла:Дата:времяПлатформа
System.design.dll2.0.50727.18155,046,27227 Февраля 2008 г.11: 47X86

Статус

Корпорация Майкрософт подтверждает, что это проблема в продуктах Майкрософт, перечисленных в разделе «Применяется к»..

Действия по воспроизведению проблемы

  1. Создайте новое консольное приложение с именем «ConsoleAppTestDTset».
  2. Создание нового элемента набора данных с именем «DsTest.xsd».
  3. Добавить таблицу DataTable тип с именем «dtTest».
  4. Добавьте два столбца с именем col1 и col2 в таблицу. Убедитесь, что тип данных каждого столбца установлено значениеSystem.Int32.
  5. Задайте следующее выражение «столбец 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();
            }
    При запуске приложения, строку выражения не отображается в окне вывода, должным образом.
  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;
       }
    ...
    
    При сохранении и повторно запустите приложение, в окне вывода отображается строка выражения.
Примечание.Если изменитьНабор данныхобъект, а затем Перестройте приложение, код, добавленный на шаге 8 исчезает.

Для получения дополнительных сведений о двоичной сериализацииНабор данныхобъекты, посетите следующий веб-узел Microsoft Developer Network (MSDN):
http://msdn2.Microsoft.com/en-US/Magazine/cc163911.aspx
Дополнительные сведения о терминах, используемых при описании обновлений программного обеспечения, см. в следующей статье базы знаний Майкрософт::
824684Стандартные термины, используемые при описании обновлений программных продуктов Майкрософт
Примечание. Это ЭКСПРЕСС-ПУБЛИКАЦИЯ, подготовленная непосредственно службой технической поддержки Майкрософт . Сведения, содержащиеся в данном документе, предоставлены в качестве отклика на возникшие проблемы. Из-за срочности в материалах могут быть опечатки, и в любое время и без уведомления в них могут быть внесены изменения. Чтобы получить дополнительные сведения, см. Условия использования.

Свойства

Код статьи: 948646 - Последний отзыв: 28 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft .NET Framework 2.0
Ключевые слова: 
kbqfe kbexpertiseadvanced kbmt KB948646 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:948646

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com