#prog #rust #rustlib #serde #amazingopensource
Хозяйке на заметку
Подборка библиотек для работы с serde от замечательногоТоляна dtolnay.
erased-serde — трейты из serde со стёртыми типами. Позволяют сделать из (де)сериализаторов трейт-объекты. Обычно это запрещено правилами object safety из-за наличия обобщённых типов.
typetag — сериализация и десериализация трейт-объектов. Работает на костылях.
serde-repr — делегирует (де)сериализацию C-like enum его числовому значению.
serde-stacker — позволяет десериализовывать глубоко вложенные структуры, динамически выделяя память под стек. Работает, увы, не на всех OS: нормально работает на linux и MacOS и течёт на Windows.
serde-ignored — позволяет обернуть десериализатор с кастомный коллбеком, который будет вызываться на всех проигнорированных в процессе десериализации ключах.
Хозяйке на заметку
Подборка библиотек для работы с serde от замечательного
erased-serde — трейты из serde со стёртыми типами. Позволяют сделать из (де)сериализаторов трейт-объекты. Обычно это запрещено правилами object safety из-за наличия обобщённых типов.
typetag — сериализация и десериализация трейт-объектов. Работает на костылях.
serde-repr — делегирует (де)сериализацию C-like enum его числовому значению.
serde-stacker — позволяет десериализовывать глубоко вложенные структуры, динамически выделяя память под стек. Работает, увы, не на всех OS: нормально работает на linux и MacOS и течёт на Windows.
serde-ignored — позволяет обернуть десериализатор с кастомный коллбеком, который будет вызываться на всех проигнорированных в процессе десериализации ключах.
GitHub
GitHub - dtolnay/erased-serde: Type-erased Serialize, Serializer and Deserializer traits
Type-erased Serialize, Serializer and Deserializer traits - dtolnay/erased-serde
Раз уж тут так много новых людей — и особенно много тех, с кем я совершенно не знаком — пожалуй, стоит рассказать немного о себе и об этом канале.
Меня зовут Антон, ястудент человек студенческого возраста и в настоящий момент я работаю программистом, по работе пишу в основном... Да, на Rust, а как вы догадались? Я люблю Rust и ненавижу примерно все остальные языки программирования. Круг моих интересов относительно широк, но на канал изливается в основном программирование (серьёзно, около половины постов с хештегом #prog). Этот канал изначально планировался как удобная свалка ссылок, материалов и #meme-ов, и... Он таковым, в сущности, и остался. В своё оправдание я могу сказать, что все статьи (выкладываемые с хештегом #article) я всегда читаю перед тем, как выложить, так что делюсь я тем, что считаю стоящим своей аудитории.
Также ведение своего канала сподвигнуло меня на написание своих постов (и иногда даже перевод чужих статей), которые я выкладываю под хештегом #моё (как, впрочем, и созданные мною мемы). В их числе я хотел бы отметить:
- написание трейта, гарантирующего нулевой размер типа
- оптимизация размера итератора из стандартной библиотеки Rust (увы, не принятая)
- реализация zero-cost форматировщиков даты
- разбор различных способ реализации полиморфизма, с их достоинствами и недостатками
- эпические "Хроники замыканий" в 3 (пока что) частях: раз, два, три
- деликатный и глубокий анализ недостатков регулярных выражений
Для удобства привожу список всех хештегов на канале (может быть пополнен в будущем):
#3dcg
#abnormalprogramming
#algo
#amazingopensource
#anime
#art
#article
#bash
#bio
#blogrecommendation
#c
#cinema
#clojure
#cpp
#csharp
#db
#demoscene
#design
#dotnet
#erlang
#game
#go
#idris
#itsec
#haskell
#js
#java
#julia
#justrustaceanthings
#kbd
#life
#math
#mechanics
#meme
#menacingopensource
#ml
#mood
#music
#outoflinestorage
#parsing
#performancetrap
#php
#pixelart
#politota
#postgresql
#prog
#psy
#puzzle
#python
#quotes
#regex
#retroit
#r
#rust
#rustasync
#rustforlinux
#rustreleasenotes
#rustlib
#scala
#science
#serde
#shell
#soc
#softskills
#sql
#successstory
#suckassstory
#tips
#typescript
#video
#web
#zig
#бомбёжкипост
#культурнаяпрограмма
#лингво
#моё
#право
#трудовыебудни
Ну и традиционно — лайки, колокольчик, рассказывайте друзьям, бла бла бла, ну, вы знаете, как это обычно выглядит. Ну и раз уж я пока не могу поприветствовать каждого лично, я поприветствую всех новоприбывших скопом:
Добро пожаловать на канал!
Меня зовут Антон, я
Также ведение своего канала сподвигнуло меня на написание своих постов (и иногда даже перевод чужих статей), которые я выкладываю под хештегом #моё (как, впрочем, и созданные мною мемы). В их числе я хотел бы отметить:
- написание трейта, гарантирующего нулевой размер типа
- оптимизация размера итератора из стандартной библиотеки Rust (увы, не принятая)
- реализация zero-cost форматировщиков даты
- разбор различных способ реализации полиморфизма, с их достоинствами и недостатками
- эпические "Хроники замыканий" в 3 (пока что) частях: раз, два, три
- деликатный и глубокий анализ недостатков регулярных выражений
Для удобства привожу список всех хештегов на канале (может быть пополнен в будущем):
#3dcg
#abnormalprogramming
#algo
#amazingopensource
#anime
#art
#article
#bash
#bio
#blogrecommendation
#c
#cinema
#clojure
#cpp
#csharp
#db
#demoscene
#design
#dotnet
#erlang
#game
#go
#idris
#itsec
#haskell
#js
#java
#julia
#justrustaceanthings
#kbd
#life
#math
#mechanics
#meme
#menacingopensource
#ml
#mood
#music
#outoflinestorage
#parsing
#performancetrap
#php
#pixelart
#politota
#postgresql
#prog
#psy
#puzzle
#python
#quotes
#regex
#retroit
#r
#rust
#rustasync
#rustforlinux
#rustreleasenotes
#rustlib
#scala
#science
#serde
#shell
#soc
#softskills
#sql
#successstory
#suckassstory
#tips
#typescript
#video
#web
#zig
#бомбёжкипост
#культурнаяпрограмма
#лингво
#моё
#право
#трудовыебудни
Ну и традиционно — лайки, колокольчик, рассказывайте друзьям, бла бла бла, ну, вы знаете, как это обычно выглядит. Ну и раз уж я пока не могу поприветствовать каждого лично, я поприветствую всех новоприбывших скопом:
Добро пожаловать на канал!
Telegram
Блог*
#prog #rust #article #моё
Как я и обещал, я... Так, погодите, я не писал об этом в блоге? Впрочем, ладно, напишу сейчас: я планировал написать перевод этой статьи и выложить его на Хабре. Собственно, сегодня я это и сделал.
Как я и обещал, я... Так, погодите, я не писал об этом в блоге? Впрочем, ладно, напишу сейчас: я планировал написать перевод этой статьи и выложить его на Хабре. Собственно, сегодня я это и сделал.
👍8🤮1💩1🤡1
Блог*
#prog #rust #rustlib #serde #amazingopensource Хозяйке на заметку Подборка библиотек для работы с serde от замечательного Толяна dtolnay. erased-serde — трейты из serde со стёртыми типами. Позволяют сделать из (де)сериализаторов трейт-объекты. Обычно это…
#prog #rust #rustlib #serde #amazingopensource
serde-query — библиотека для эффективного разбора форматов, поддерживаемых serde, которая десериализует данные не целиком, а только части, относящиеся к типу, в который происходит десериализация.
serde-query — библиотека для эффективного разбора форматов, поддерживаемых serde, которая десериализует данные не целиком, а только части, относящиеся к типу, в который происходит десериализация.
GitHub
GitHub - pandaman64/serde-query
Contribute to pandaman64/serde-query development by creating an account on GitHub.
Блог*
#prog #rust #rustlib #serde #amazingopensource Хозяйке на заметку Подборка библиотек для работы с serde от замечательного Толяна dtolnay. erased-serde — трейты из serde со стёртыми типами. Позволяют сделать из (де)сериализаторов трейт-объекты. Обычно это…
#prog #rust #rustlib #serde
serde-diff
"A small helper that can
1. Serialize the fields that differ between two values of the same type
2. Apply previously serialized field differences to other values of the same type."
serde-diff
"A small helper that can
1. Serialize the fields that differ between two values of the same type
2. Apply previously serialized field differences to other values of the same type."
GitHub
GitHub - amethyst/serde-diff: Utility for comparing two structs and re-applying the differences to other structs
Utility for comparing two structs and re-applying the differences to other structs - GitHub - amethyst/serde-diff: Utility for comparing two structs and re-applying the differences to other structs
#prog #rust #serde #rustlib
В расточате подкинули библиотеку serde_with_macros — пачку полезных фич для serde. В частности, атрибут на структуру, который диктует не сериализовать отсутствующие опциональные поля.
Довольно много постов про библиотеки для serde. Может, ввести отдельный хештег? 🤔
В расточате подкинули библиотеку serde_with_macros — пачку полезных фич для serde. В частности, атрибут на структуру, который диктует не сериализовать отсутствующие опциональные поля.
Довольно много постов про библиотеки для serde. Может, ввести отдельный хештег? 🤔
#prog #rust #rustlib #serde
Трейт Deserializer имеет методы вида deserialize_type. Трейт Serializer имеет методы вида serialize_type. Что это значит? Это значит, что одно можно непосредственно сцепить с другим, и таким образом перегонять данные из одного формата данных, поддерживаемых serde, в другой, никогда не материализуя экземпляры соответствующих типов в памяти целиком. Собственно, именно это и делает serde-transcode.
Пример из документации (преттификация JSON):
Трейт Deserializer имеет методы вида deserialize_type. Трейт Serializer имеет методы вида serialize_type. Что это значит? Это значит, что одно можно непосредственно сцепить с другим, и таким образом перегонять данные из одного формата данных, поддерживаемых serde, в другой, никогда не материализуя экземпляры соответствующих типов в памяти целиком. Собственно, именно это и делает serde-transcode.
Пример из документации (преттификация JSON):
extern crate serde;
extern crate serde_json;
extern crate serde_transcode;
use serde::Serialize;
use serde_json::{Serializer, Deserializer};
use std::io::{Read, Write, BufReader, BufWriter};
use std::fs::File;
fn main() {
let reader = BufReader::new(File::open("input.json").unwrap());
let writer = BufWriter::new(File::create("output.json").unwrap());
let mut deserializer = Deserializer::from_reader(reader);
let mut serializer = Serializer::pretty(writer);
serde_transcode::transcode(&mut deserializer, &mut serializer).unwrap();
serializer.into_inner().flush().unwrap();
}
docs.rs
Deserializer in serde - Rust
A data format that can deserialize any data structure supported by Serde.
#prog #rust #serde #article
У serde не самая интуитивная архитектура. В данной паре статей автор попытался показать её на примере. В первой статье автор разбирает код для десериализации, сгенерированный derive для простого примера. Во второй статье автор показывает, как самостоятельно написать десериализатор для простого формата.
У serde не самая интуитивная архитектура. В данной паре статей автор попытался показать её на примере. В первой статье автор разбирает код для десериализации, сгенерированный derive для простого примера. Во второй статье автор показывает, как самостоятельно написать десериализатор для простого формата.
#prog #rust #serde
В serde_json есть тип Value, который может представить любое валидное JSON-значение. Есть парочка вещей, которые не столь известны и стоят упоминания.
1.
2. В
3.
4. Если вам нужно достать глубоко вложенное значение, можно вместо череды индексаций или вызовов
6. У
В serde_json есть тип Value, который может представить любое валидное JSON-значение. Есть парочка вещей, которые не столь известны и стоят упоминания.
1.
Value
, а также обе разновидности ссылок на него могут быть сравнены на равенство со всеми примитивными числами, bool
, str
и String
.2. В
Value
можно сконвертировать из множества различных типов, которые могут входить в его состав, а также составлять из итератора по элементам и итератора по элементам вместе с ключами.3.
Value
можно индексировать как строками, так и числовыми индексами, при этом в случае, если индексировать значение таким образом нельзя, иммутабельное индексирование вместо паники возвращает ссылку на Value::Null
.4. Если вам нужно достать глубоко вложенное значение, можно вместо череды индексаций или вызовов
get
использовать метод pointer/pointer_mut, которые достают значение по указанному строковому пути:let data = json!({
"x": {
"y": ["z", "zz"]
}
});
assert_eq!(data.pointer("/x/y/1").unwrap(), &json!("zz"));
assert_eq!(data.pointer("/a/b/c"), None);
5. Value
и &Value
реализуют Deserialize
. Это значит, что если у вас есть разобранный JSON в неструктурированном виде, вы можете сконвертировать его в свои типы, реализующие Deserialize
— причём в случае со ссылкой у вас при этом останется изначальный JSON. Так можно пробовать десериализовывать поочерёдно в несколько типов, и это может оказаться дешевле, чем парсить всё с нуля.6. У
Value
есть собрат RawValue. Этот тип фактически представляет собой синтаксически валидный JSON, который хранится в виде слайса на входную строку. Его можно использовать для того, чтобы проводить манипуляции над JSON и при этом не хранить разобранный JSON в памяти целиком:use serde::{Deserialize, Serialize};
use serde_json::{Result, value::RawValue};
#[derive(Deserialize)]
struct Input<'a> {
code: u32,
#[serde(borrow)]
payload: &'a RawValue,
}
#[derive(Serialize)]
struct Output<'a> {
info: (u32, &'a RawValue),
}
// Efficiently rearrange JSON input containing separate "code" and "payload"
// keys into a single "info" key holding an array of code and payload.
//
// This could be done equivalently using serde_json::Value as the type for
// payload, but &RawValue will perform better because it does not require
// memory allocation. The correct range of bytes is borrowed from the input
// data and pasted verbatim into the output.
fn rearrange(input: &str) -> Result<String> {
let input: Input = serde_json::from_str(input)?;
let output = Output {
info: (input.code, input.payload),
};
serde_json::to_string(&output)
}
fn main() -> Result<()> {
let out = rearrange(r#" {"code": 200, "payload": {}} "#)?;
assert_eq!(out, r#"{"info":[200,{}]}"#);
Ok(())
}
docs.rs
Value in serde_json - Rust
Represents any valid JSON value.
👍10
Блог*
#prog #rust #rustlib #serde #amazingopensource Хозяйке на заметку Подборка библиотек для работы с serde от замечательного Толяна dtolnay. erased-serde — трейты из serde со стёртыми типами. Позволяют сделать из (де)сериализаторов трейт-объекты. Обычно это…
#prog #rust #serde #article
Exploring Traits with Erased ‘serde’ — статья с демонстрацией того, как erased-serde выглядит на практике и где это может пригодиться
Exploring Traits with Erased ‘serde’ — статья с демонстрацией того, как erased-serde выглядит на практике и где это может пригодиться
The Coded Message
Exploring Traits with Erased 'serde'
I came across a programming problem recently where I wanted to use dynamic polymorphism with serde. This turned out to be much easier than I expected, and I thought it was an interesting enough case study to share, especially for people who are learning Rust.…
#prog #rust #serde #suckassstory
t.me/psauxww/923
И да, де-факто эта строчка-индикатор настолько часто захардкожена в проектах на Rust, что есть предложение сделать её публичной.
t.me/psauxww/923
И да, де-факто эта строчка-индикатор настолько часто захардкожена в проектах на Rust, что есть предложение сделать её публичной.
Telegram
Segment@tion fault
У serde_json есть такая "приятная" особенность, как поддержка arbitrary precision numbers.
Оно, безусловно, хорошо в тех кейсах, где действительно нужна длинная математика. Но рассмотрим такой пример:
Alice
let val: serde_json::Value = json!({"number":1234567890});…
Оно, безусловно, хорошо в тех кейсах, где действительно нужна длинная математика. Но рассмотрим такой пример:
Alice
let val: serde_json::Value = json!({"number":1234567890});…
😱6🖕1
#prog #rust #serde #rustlib
ijson — более эффективная по памяти альтернатива serde_json::Value.
This crate offers a replacement for
As a ballpark figure, it will typically use half as much memory as serde-json when deserializing a value and the memory footprint of cloning a value is more than 7x smaller.
The primary type exposed by this crate is the
ijson — более эффективная по памяти альтернатива serde_json::Value.
This crate offers a replacement for
serde-json
’s Value
type, which is significantly more memory efficient.As a ballpark figure, it will typically use half as much memory as serde-json when deserializing a value and the memory footprint of cloning a value is more than 7x smaller.
The primary type exposed by this crate is the
IValue
type. It is guaranteed to be pointer-sized and has a niche (so Option<IValue>
is also guaranteed to be pointer-sized).crates.io
crates.io: Rust Package Registry
❤5🤣1
#prog #rust #serde #article
Faster Rust Serialization
Или несколько советов о том, как делать меньше лишней работы при сериализации с использованием serde.
Faster Rust Serialization
Или несколько советов о том, как делать меньше лишней работы при сериализации с использованием serde.
Mo8It
Faster Rust Serialization
How to speed up serialization in Rust by more than 2x
👍4👎1
Блог*
😒🤚 miniserde 😏👉 сердечко
#prog #rust #rustlib
miniserde — библиотека для (де)сериализации из/в JSON. В отличие от #serde, довольно ограничена, практически лишена опций для кастомизации и генерирует код, который использует трейт-объекты вместо дженериков. За счёт последнего компилируется значительно быстрее serde и при этом не сильно уступает в производительности.
miniserde — библиотека для (де)сериализации из/в JSON. В отличие от #serde, довольно ограничена, практически лишена опций для кастомизации и генерирует код, который использует трейт-объекты вместо дженериков. За счёт последнего компилируется значительно быстрее serde и при этом не сильно уступает в производительности.
Lib.rs
Miniserde — Rust data encoding library
Data structure serialization library with several opposite design goals from Serde
😍7🤡3👍1🥴1