структура
private struct s
{
public bool Move;
public int xPos;
public int yPos;
}
s tmp;
и массив байтов
byte[]=new byte[n];
дак вот, надо эту переменную, структуру и массив байтов запихать в другой массив байтов
что бы отправить в socket а на клиентской стороне все это вытащить из того же массива байтов.
Как все это организовать без указателей?
Как упаковать переменые разных типов в один byte[]
Здравствуйте Vyacheslav_M, Вы писали:
VM>Привет всем!
VM>Есть следующая задача:
VM>есть переменная VM>int var;
VM>структура VM>private struct s VM>{ VM> public bool Move; VM> public int xPos; VM> public int yPos; VM>} VM>s tmp;
VM>и массив байтов VM>byte[]=new byte[n];
VM>дак вот, надо эту переменную, структуру и массив байтов запихать в другой массив байтов VM>что бы отправить в socket а на клиентской стороне все это вытащить из того же массива байтов. VM>Как все это организовать без указателей?
Ну для int и byte[] все просто
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
br.Write(var);
br.Write(bytearr);
socket.Send(ms.Buffer);
Для классов и структур все немножко посложнее
//Твою структурку надо пометить как сериализуемую
[Serializable]
private struct s {
public bool Move;
public int xPos;
public int yPos;
}
...
//Ну а далее выбираешь сериализатор и вперед
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
IFormatter formatter = new BinaryFormatter();
br.Write(var);
formatter.Serialize(ms,s);
br.Write(bytearr);
socket.Send(ms.Buffer);
AVK>MemoryStream ms = new MemoryStream();
AVK>BinaryWriter bw = new BinaryWriter(ms);
AVK>br.Write(var);
AVK>br.Write(bytearr);
AVK>socket.Send(ms.Buffer);
AVK>
AVK>Для классов и структур все немножко посложнее AVK>
AVK>//Твою структурку надо пометить как сериализуемую
AVK>[Serializable]
AVK>private struct s {
AVK> public bool Move;
AVK> public int xPos;
AVK> public int yPos;
AVK>}
AVK>...
AVK>//Ну а далее выбираешь сериализатор и вперед
AVK>MemoryStream ms = new MemoryStream();
AVK>BinaryWriter bw = new BinaryWriter(ms);
AVK>IFormatter formatter = new BinaryFormatter();
AVK>br.Write(var);
AVK>formatter.Serialize(ms,s);
AVK>br.Write(bytearr);
AVK>socket.Send(ms.Buffer);
AVK>
а как записать в MemoryStream переменную типа перечисление?
Здравствуйте Vyacheslav_M, Вы писали:
VM>Здравствуйте AndrewVK, Вы писали:
VM>а как записать в MemoryStream переменную типа перечисление?
Например через тот-же Formatter...
Или определить базовый тип перечисления (System.Enum.GetUnderlyingType()) и записать его.
Или преобразовать enum в строку и записать ее
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте VladD2, Вы писали:
VD>А может человеку лучше о ремоутенге почитать? Все же вручную с сокетами это мазахизм, тем более что имеется такой развитой механизм как ремоутинг...
Может быть. А может и нет. Он же как обычно не сказал подробно что хочет. Может там вобще ничего пересылать не нужно. А может структуру в каком то особенном формате пересылать надо. Тут можно только гадать.
Здравствуйте VladD2, Вы писали:
VD>А может человеку лучше о ремоутенге почитать? Все же вручную с сокетами это мазахизм, тем более что имеется такой развитой механизм как ремоутинг...
Здравствуйте Vyacheslav_M, Вы писали:
VM>Здравствуйте VladD2, Вы писали:
VD>>А может человеку лучше о ремоутенге почитать? Все же вручную с сокетами это мазахизм, тем более что имеется такой развитой механизм как ремоутинг...
VM>А что это такое и с чем его едят???
Здравствуйте, AndrewVK, Вы писали:
AVK>Для классов и структур все немножко посложнее AVK>
AVK>//Твою структурку надо пометить как сериализуемую
AVK>[Serializable]
AVK>private struct s {
AVK> public bool Move;
AVK> public int xPos;
AVK> public int yPos;
AVK>}
AVK>...
AVK>//Ну а далее выбираешь сериализатор и вперед
AVK>MemoryStream ms = new MemoryStream();
AVK>BinaryWriter bw = new BinaryWriter(ms);
AVK>IFormatter formatter = new BinaryFormatter();
AVK>br.Write(var);
AVK>formatter.Serialize(ms,s);
AVK>br.Write(bytearr);
AVK>socket.Send(ms.Buffer);
AVK>
А по другому (но стандартными средствами) никак? А то у меня структура с единственным Int32 полем в сеарилизованном состоянии заняла 165! байт.
И еще вопрос про Remoting, он только по TCP/IP умеет ходить, или можно к другим протоколам привязать?
Hello, "Ed.ward" > > А по другому (но стандартными средствами) никак? А то у меня структура с единственным Int32 полем в сеарилизованном состоянии заняла 165! байт. >
Надо имя структуры по короче сделать. Или можно использовать яву классы — там примерно в 1.5 раза компактнее
using System;
namespace SerializationTest
{
[Serializable]
public struct CSStruct
{
public int csValue;
}
public struct JSStruct : java.io.Serializable
{
public int jsValue;
}
class TestConsole
{
[STAThread]
static void Main(string[] args)
{
SerializeCS();
SerializeJS();
}
static void SerializeJS()
{
java.io.ByteArrayOutputStream stm;
java.io.ObjectOutputStream objectStm;
stm = new java.io.ByteArrayOutputStream();
objectStm = new java.io.ObjectOutputStream(stm);
objectStm.writeObject(new JSStruct());
Console.WriteLine("Java Serialization (SimpleStruct): {0}", stm.size());
stm = new java.io.ByteArrayOutputStream();
objectStm = new java.io.ObjectOutputStream(stm);
java.util.ArrayList list = new java.util.ArrayList();
for (int i = 0 ; i < 10 ; ++i) {
list.add(new JSStruct());
}
objectStm.writeObject(list);
Console.WriteLine("Java Serialization (ArrayList): {0}", stm.size());
}
static void SerializeCS()
{
System.IO.MemoryStream stm;
using (stm = new System.IO.MemoryStream())
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formatter.Serialize(stm, new CSStruct());
Console.WriteLine(".NET Serialization (SimpleStruct): {0}", stm.Length);
}
using (stm = new System.IO.MemoryStream())
{
System.Collections.ArrayList list = new System.Collections.ArrayList();
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
for (int i = 0 ; i < 10 ; ++i) {
list.Add(new CSStruct());
}
formatter.Serialize(stm, list);
Console.WriteLine(".NET Serialization (ArrayList): {0}", stm.Length);
}
}
}
}
> И еще вопрос про Remoting, он только по TCP/IP умеет ходить, или можно к другим протоколам привязать? >
NamedPipes, MSMQ, MSNMessenger, Jabber, SMTP, HTTP, CORBA, MemoryMappedFiles и еще что-нибудь...
Искать: BidirectionalTCPChannel.zip, jabberchannel.zip, MSMQChannel_src.zip, NamedPipeChannel.zip, smtpchannel.zip
Posted via RSDN NNTP Server 1.6 beta
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Ed.ward, Вы писали:
EW>А по другому (но стандартными средствами) никак? А то у меня структура с единственным Int32 полем в сеарилизованном состоянии заняла 165! байт.
Если тебе единственное поле надо переслать, или если надо переслать в виде потока байтов определенного формата (чтобы другая программа не на дотнете понимала, например), то посмотри в сторону System.BitConverter.GetBytes(). Обратное преобразование — System.BitConverter.ToInt32().
EW>И еще вопрос про Remoting, он только по TCP/IP умеет ходить, или можно к другим протоколам привязать?
Можно к чему угодно привязать, но возни будет очень много. Инго Раммер в своей книге, например, приводит реализацию ремоутинга через е-мэйлы (при вызове функции серверу посылается е-мэйл, он отвечает е-мэйлом с результатом).
Hello, "Vadim B"
> EW>И еще вопрос про Remoting, он только по TCP/IP умеет ходить, или можно к другим протоколам привязать? > > Можно к чему угодно привязать, но возни будет очень много. Инго Раммер в своей книге, например, приводит реализацию ремоутинга через е-мэйлы (при вызове функции серверу посылается е-мэйл, он отвечает е-мэйлом с результатом).
Не он первый это придумал. В Technology Preview для .NET Framework и не такое было
Posted via RSDN NNTP Server 1.6 beta
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Vadim B, Вы писали:
VB>Здравствуйте, Ed.ward, Вы писали:
EW>А по другому (но стандартными средствами) никак? А то у меня структура с единственным Int32 полем в сеарилизованном состоянии заняла 165! байт.
VB>Если тебе единственное поле надо переслать, или если надо переслать в виде потока байтов определенного формата (чтобы другая программа не на дотнете понимала, например), то посмотри в сторону System.BitConverter.GetBytes(). Обратное преобразование — System.BitConverter.ToInt32().
Мне надо пересылать кучу пакетиков туда-сюда.
Для простоты (как я это делал в С++) я структуру этих пакетиков описал структурами, а потом обнаружил, что сеарилизация создаст мне неплохой трафик, а другого способа представить структуру как массив байт я не нашел.
Здравствуйте, Ed.ward, Вы писали:
VB>>Если тебе единственное поле надо переслать, или если надо переслать в виде потока байтов определенного формата (чтобы другая программа не на дотнете понимала, например), то посмотри в сторону System.BitConverter.GetBytes(). Обратное преобразование — System.BitConverter.ToInt32().
EW>Мне надо пересылать кучу пакетиков туда-сюда. EW>Для простоты (как я это делал в С++) я структуру этих пакетиков описал структурами, а потом обнаружил, что сеарилизация создаст мне неплохой трафик, а другого способа представить структуру как массив байт я не нашел.
EW>Пишу вот свой теперь преобразователь...
Аналогично. Мне нужно было передавать и принимать данные, подстраиваясь под существующий протокол, так что пришлось написать преобразователь, на нижнем уровне основанный на System.BitConverter, о котором я говорил выше.
Здравствуйте, Vadim B, Вы писали:
VB>Здравствуйте, Ed.ward, Вы писали:
VB>>Если тебе единственное поле надо переслать, или если надо переслать в виде потока байтов определенного формата (чтобы другая программа не на дотнете понимала, например), то посмотри в сторону System.BitConverter.GetBytes(). Обратное преобразование — System.BitConverter.ToInt32().
EW>Мне надо пересылать кучу пакетиков туда-сюда. EW>Для простоты (как я это делал в С++) я структуру этих пакетиков описал структурами, а потом обнаружил, что сеарилизация создаст мне неплохой трафик, а другого способа представить структуру как массив байт я не нашел.
EW>Пишу вот свой теперь преобразователь...
VB>Аналогично. Мне нужно было передавать и принимать данные, подстраиваясь под существующий протокол, так что пришлось написать преобразователь, на нижнем уровне основанный на System.BitConverter, о котором я говорил выше.
Угу
Только, по-моему, проще опираться сразу на Binary(Writer/Reader)