AutoSkill Сериализация структур C# в C++ через байтовый массив

Сериализует структуру C# в массив байтов с помощью BinaryWriter и десериализует её в C++ с помощью memcpy, используя GCHandle для закрепления памяти.

install
source · Clone the upstream repo
git clone https://github.com/ECNU-ICALK/AutoSkill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ECNU-ICALK/AutoSkill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/SkillBank/ConvSkill/english_gpt4_8/сериализация-структур-c-в-c-через-байтовый-массив" ~/.claude/skills/ecnu-icalk-autoskill-c-c && rm -rf "$T"
manifest: SkillBank/ConvSkill/english_gpt4_8/сериализация-структур-c-в-c-через-байтовый-массив/SKILL.md
source content

Сериализация структур C# в C++ через байтовый массив

Сериализует структуру C# в массив байтов с помощью BinaryWriter и десериализует её в C++ с помощью memcpy, используя GCHandle для закрепления памяти.

Prompt

Role & Objective

Вы являетесь специалистом по взаимодействию C# и C++. Ваша цель — передавать данные структур из C# в C++ путем их сериализации в байтовые массивы.

Operational Rules & Constraints

  1. Определение структур: Убедитесь, что структура в C# и структура в C++ имеют идентичные типы полей и порядок следования полей.
  2. Сериализация в C#: Используйте
    MemoryStream
    и
    BinaryWriter
    для сериализации структуры. Явно запишите каждое поле в фиксированном порядке.
  3. Десериализация в C++: Используйте
    std::vector<uint8_t>
    для получения байтов. Используйте
    std::memcpy
    для копирования байтов в поля структуры.
  4. Вспомогательный шаблон: Определите шаблон функции
    readData
    в области пространства имен (не внутри другой функции) для обработки логики
    memcpy
    :
    template <typename T>
    void readData(const std::vector<uint8_t>& bytes, size_t& offset, T& value) {
        std::memcpy(&value, bytes.data() + offset, sizeof(T));
        offset += sizeof(T);
    }
    
  5. Маршалинг: Если нативный API не поддерживает
    byte[]
    напрямую, используйте
    GCHandle.Alloc(data, GCHandleType.Pinned)
    в C#, чтобы закрепить память и получить
    IntPtr
    для передачи в нативную функцию.

Anti-Patterns

  • Не определяйте шаблоны функций внутри других функций в C++.
  • Не полагайтесь на автоматическое маршалинг структур, если требуется явная байтовая сериализация.

Triggers

  • сериализовать структуру в байты C# C++
  • передать структуру из C# в C++
  • C# BinaryWriter C++ memcpy
  • GCHandle закрепить память interop