none
КАК ПЕРЕКОДИРОВАТЬ object В byte[] ? RRS feed

  • Вопрос

  • возникла необходимость перекодировать некий объет object он может содержать от экземпляра класса например в тип byte для последующей отправки по каналу связи в виде массива байтов.

     

    class data

            {

              public  string text;

              public bool bol;

              public uint uch;

            }

     private void button1_Click(object sender, EventArgs e)

            {

                byte[] mm = new byte[1024] ;

     

                data newdata = new data();

                newdata.text = "hello";

                newdata.bol = false;

                newdata.uch = 0x000006;

     

                object aa = newdata;

    }

    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:28 MSDN Forums Consolidation (От:Visual C#)

Ответы

  • Нет, клиент пишет тебе что пытается "раскодировать" объект типа data, тип дата объявлен в My_server.dll. Чтобы создать объект какого-то типа в приложении-клиенте, нужна явная ссылка на тип этого объекта.

    Добавь в клиентском приложении ссылку (reference) на my_server. А еще лучше - вынеси "перекодируемые" классы в отдельную dll, скажем, my_data. И добавь на нее ссылку и на сервере и на клиенте.

    • Помечено в качестве ответа NIKkakNIK 23 мая 2010 г. 14:14

Все ответы

  • Воспользуйтесь классом BinaryFormatter для получения массива байтов.

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    
    namespace BinaryFormatterSample
    {
      class Program
      {
        static void Main(string[] args)
        {
          //Serialization
          data d = new data
          {
            text = "sample text",
            bol = true,
            uch = 10
          };
    
          MemoryStream stream = new MemoryStream();
          BinaryFormatter formatter = new BinaryFormatter();
          try
          {
            formatter.Serialize(stream, d);
          }
          catch (Exception ex)
          {
            Console.WriteLine(ex.Message);
          }
    
          stream.Position = 0;
          //Get byte array
          byte[] buffer = stream.ToArray();
          Console.WriteLine(buffer.Length);
    
    
          //Deserialization
          data newd = null;
          try
          {
            newd = (data)formatter.Deserialize(stream);
          }
          catch (Exception ex)
          {
            Console.WriteLine(ex.Message);
          }
    
          stream.Close();
    
          Console.WriteLine(newd.text + " " + newd.bol + " " + newd.uch);
        }
      }
    
      [Serializable]
      public class data
      {
    
        public string text;
    
        public bool bol;
    
        public uint uch;
    
      }
    }
    
    • Помечено в качестве ответа I.Vorontsov 20 мая 2010 г. 7:22
    • Снята пометка об ответе NIKkakNIK 22 мая 2010 г. 11:58
    • Помечено в качестве ответа NIKkakNIK 22 мая 2010 г. 14:28
    • Снята пометка об ответе NIKkakNIK 22 мая 2010 г. 19:08
  • Возможно у Вас есть на то свои причины, но желательно избегать типов, подобно uint, т.к. они не совместимы с CLS и использовать вместо, например uint - int или Int32

  • да вроде в массив байтов кодирует но как перекодировать обратно из массива байтов а не с потока как показано или как перекодировать массив байтов в поток?

     

    try
      {
      newd = (data)formatter.Deserialize(stream); // ты перекодируешь из потока 
      }
      catch (Exception ex)
      {
      Console.WriteLine(ex.Message);
      }

    как перекодировать из полученного массива buffer ( byte[] buffer = stream.ToArray(); ) в поток  MemoryStream ??? 
    у меня не выходит

     

  • MemoryStream stream = new MemoryStream(buffer);
  • Не подскажешь почему при декодирование массива в другом приложение он выдает ошибку? 

     

    пишет: Не удалось найти сборку "My_server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null". 

    он ссылается на приложение в котором я кодировал. 

    как можно декодировать в другом приложение?

  • А причем здесь декодирование??

    У вас программа сборку не может найти - неправильно подключаете.

  • он ссылается на сборку "My_server....." это и есть программа в  которой объект серелизуется а десерелизуется он в другой программе но ссылается на программу которая его серелизовала. как от этого можно избавиться ?   
  • Дык он не видит вобще сборку My_server, подключите нормально сборку!

    Сериализация не при чем, повторяю.

  • как подключить ее если это совершенно другая программа ??? есть 2 приложения сервер(My_server) и клиент, так вот клиент не может перекодировать и пишет что это надо сделать в сервере !!! может ли ошибка возникать если кодируется в одном приложении и декодируеться в другом?   

  • Нет, клиент пишет тебе что пытается "раскодировать" объект типа data, тип дата объявлен в My_server.dll. Чтобы создать объект какого-то типа в приложении-клиенте, нужна явная ссылка на тип этого объекта.

    Добавь в клиентском приложении ссылку (reference) на my_server. А еще лучше - вынеси "перекодируемые" классы в отдельную dll, скажем, my_data. И добавь на нее ссылку и на сервере и на клиенте.

    • Помечено в качестве ответа NIKkakNIK 23 мая 2010 г. 14:14
  • да действительно с dll заработал