Здравствуйте, Ed.ward, Вы писали:
M>>Можно быстрее и дешевле, используя System.Runtime.InteropServices.Marshal и его методы StructureToPtr и Copy.
EW>Хм... EW>Я так понял, что мне под это дело нужно будет блок неупрявляемого кода писать?
Нет, маршалер вполне managed. Просто ты можешь столкнуться с тем что после очередной версии у тебя старые данные перестанут работать.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Ed.ward, Вы писали:
M>>Можно быстрее и дешевле, используя System.Runtime.InteropServices.Marshal и его методы StructureToPtr и Copy.
EW>Хм... EW>Я так понял, что мне под это дело нужно будет блок неупрявляемого кода писать?
AVK>Нет, маршалер вполне managed. Просто ты можешь столкнуться с тем что после очередной версии у тебя старые данные перестанут работать.
Marshals data from a managed object to an unmanaged block of memory.
Parameters
structure
A managed object holding the data to be marshaled. This object must be an instance of a formatted class.
ptr
A pointer to an unmanaged block of memory, which must be allocated before this method is called.
fDeleteOld
true to have the Marshal.DestroyStructure method called on the ptr parameter before this method executes. Note that passing false can lead to a memory leak.
[/msdn]
Здравствуйте, Ed.ward, Вы писали:
AVK>>Нет, маршалер вполне managed. Просто ты можешь столкнуться с тем что после очередной версии у тебя старые данные перестанут работать.
EW>Marshals data from a managed object to an unmanaged block of memory.
Ну и что? unmanaged block of memory можно выделить из managed кода тем же маршаллером.
Здравствуйте, mihailik, Вы писали:
M>Можно быстрее и дешевле, используя System.Runtime.InteropServices.Marshal и его методы StructureToPtr и Copy.
Быстрее — да. Но проще . Это ты загнул. Ну, а вообще-то для быстрее было бы без Marshal. Просто взять и сериализовать это дело с помощью BinaryWriter-а по одному полю.
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ed.ward, Вы писали:
VB>>Аналогично. Мне нужно было передавать и принимать данные, подстраиваясь под существующий протокол, так что пришлось написать преобразователь, на нижнем уровне основанный на System.BitConverter, о котором я говорил выше.
EW>Угу EW>Только, по-моему, проще опираться сразу на Binary(Writer/Reader)
А как с помощью BinaryReader прочитать null-terminated string? А int32 с обратным порядком байтов (как при пересылке принято)? Если руками, то тогда не очень-то и проще получается.
EW>Угу EW>Только, по-моему, проще опираться сразу на Binary(Writer/Reader)
Тогда советую посмотреть на gotdotnet.com BinaryObjectWriter. Что-то среднее между сериализацией и Marshal.
Структуру можно разметить атрибутами, по ним этот BinaryObjectWriter её может читать и писать в поток байтов.
Метаданные, как и в способе с Marshal не пишутся, поэтому объём экономится. Но если структура поменяется — автоматически прочитать из старых данных не сможет.
Этот способ будет тормознее Marshal, но безопаснее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, mihailik, Вы писали:
M>Можно быстрее и дешевле, используя System.Runtime.InteropServices.Marshal и его методы StructureToPtr и Copy.
VD>Быстрее — да. Но проще . Это ты загнул. Ну, а вообще-то для быстрее было бы без Marshal. Просто взять и сериализовать это дело с помощью BinaryWriter-а по одному полю.
У меня примерно 50 структур содержащих от 1 до 10 полей.
Я вот написал через reflection теперь вот буду смотреть какой метод мне больше нравится
Здравствуйте, mihailik, Вы писали:
EW>Угу EW>Только, по-моему, проще опираться сразу на Binary(Writer/Reader)
M>Тогда советую посмотреть на gotdotnet.com BinaryObjectWriter. Что-то среднее между сериализацией и Marshal.
M>Структуру можно разметить атрибутами, по ним этот BinaryObjectWriter её может читать и писать в поток байтов.
M>Метаданные, как и в способе с Marshal не пишутся, поэтому объём экономится. Но если структура поменяется — автоматически прочитать из старых данных не сможет.
M>Этот способ будет тормознее Marshal, но безопаснее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, mihailik, Вы писали:
M>Можно быстрее и дешевле, используя System.Runtime.InteropServices.Marshal и его методы StructureToPtr и Copy.
VD>Быстрее — да. Но проще . Это ты загнул. Ну, а вообще-то для быстрее было бы без Marshal.
Да, проще было бы вообще через unsafe.
VD>Просто взять и сериализовать это дело с помощью BinaryWriter-а по одному полю.
Не сказал бы, что это просто. Кто гарантирует, что ты пишешь и читаешь все нужные поля и в том же порядке? Самому следить придётся, что неудобно. А если сюда Reflection прикрутить — совсем не просто получится по сравнению с Marshal.
Хотя для некоторых случаев это — лучший выход, конечно.
Здравствуйте, mihailik, Вы писали:
M>Да, проще было бы вообще через unsafe.
Тогда уж на С++. Забыть про нет и все дела.
VD>Просто взять и сериализовать это дело с помощью BinaryWriter-а по одному полю.
M>Не сказал бы, что это просто. Кто гарантирует, что ты пишешь и читаешь все нужные поля и в том же порядке?
У него в вопросе вроде блило то ли 1, то ли 2 поля (заранее известные).
M> Самому следить придётся, что неудобно. А если сюда Reflection прикрутить — совсем не просто получится по сравнению с Marshal.
Если следовать твоей логике, то стркутура может содержать ссылки...
M>Хотя для некоторых случаев это — лучший выход, конечно.
Вот его случай именно тако.
Ну, а если говорить о универсальном решении, то нужно пользоваться форматерами или переписывать всю сериализацию к чертям.
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ed.ward, Вы писали:
EW>Я вот написал через reflection теперь вот буду смотреть какой метод мне больше нравится
Учти что рефлекшон — это довольно медленно. Я бы посоветовал сделать так. Создать небольшую утилитку которая используя рефлекшон и список типов генерировала бы код (на C#) сериализации с использованием BinaryWriter-а, компилировала бы этот код и создавала сборку содержащую сериализатор для нужных типов.
Хотя если передача ведется через сетку, то скорее всего затраты на передачу по сети будут не соизмеримы с затратами на чтение решлекшона.
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>Это если какую нибудь конкретную структуру.
Речь вроде и шла о конкретных.
AVK>А если любую? Через рефлекшен?
А почему бы и нет. Если главное компактность, а на времы можно наплевать, то очень даже выход. Ну, а если нужно и быстро и компактно, то нужно генерировать код сериализации во время компиляции.
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Vadim B, Вы писали:
VB>А как с помощью BinaryReader прочитать null-terminated string? А int32 с обратным порядком байтов (как при пересылке принято)? Если руками, то тогда не очень-то и проще получается.
Если с обоих сторн дотнет, то нефига париться. BinaryReader будет читать и писать днные одинаково. В дотнете попросту нет "null-terminated string". В нем есть просто строка. И BinaryReader/BinaryWriter прекрасно умеет их писать. Вот только они юникодные.
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Vyacheslav_M, Вы писали:
V_M>дак вот, надо эту переменную, структуру и массив байтов запихать в другой массив байтов V_M>что бы отправить в socket а на клиентской стороне все это вытащить из того же массива байтов. V_M>Как все это организовать без указателей?
M>Да, проще было бы вообще через unsafe.
VD>Тогда уж на С++. Забыть про нет и все дела.
Ну да, тоже нормально.
M>Хотя для некоторых случаев это — лучший выход, конечно.
VD>Вот его случай именно тако.
VD>Ну, а если говорить о универсальном решении, то нужно пользоваться форматерами или переписывать всю сериализацию к чертям.