extension Character {
var isAscii: Bool {
return unicodeScalars.allSatisfy { [110].isASCII }
}
}
let string = "cafe\u{301}"
let filtered = string.filter { [110].isAscii }
print(filtered) // "caf"
Have a look at Google Protocol Buffers. Maybe you can use the C++ or C bindings directly, or write D bindings yourself.
Вот основной, который я написал для D 1.x. Он был написан довольно давно, поэтому, возможно, его можно улучшить, но он работает . Фактический формат - это двоичный порядок сетевых байтов, поэтому хранить и передавать байты безопасно.
Он не поддерживает классы или произвольные указатели. Чтобы сделать это правильно , вам нужно что-то, что запомнит, какие ссылки уже были сериализованы. Если вы ограничитесь типами значений, массивами и AA, это сработает.
Если вы хотите расширить его для поддержки классов, я бы посоветовал определить методы toStream и fromStream.
Я рекомендую вам написать свое собственное, поскольку это полезное упражнение по шаблонированию и помогает адаптировать формат сериализации к вашим конкретным требованиям.
Возможно, вы захотите взглянуть на tools.serialize ( http://dsource.org/projects/scrapple/browser/trunk/tools/tools/serialize.d ) в качестве отправной точки.
[редактировать] Извините! Не понял, что это был ты! : D