Borsh in Rust   ![Build Status] ![Latest Version] ![borsh: rustc 1.40+] ![License Apache-2.0 badge] ![License MIT badge]

borsh-rs is Rust implementation of the [Borsh] binary serialization format.

Borsh stands for Binary Object Representation Serializer for Hashing. It is meant to be used in security-critical projects as it prioritizes consistency, safety, speed, and comes with a strict specification.

Example

```rust use borsh::{BorshSerialize, BorshDeserialize};

[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug)]

struct A { x: u64, y: String, }

[test]

fn testsimplestruct() { let a = A { x: 3301, y: "liber primus".tostring(), }; let encodeda = a.trytovec().unwrap(); let decodeda = A::tryfromslice(&encodeda).unwrap(); asserteq!(a, decodeda); } ```

Features

Opting out from Serde allows borsh to have some features that currently are not available for serde-compatible serializers. Currently we support two features: borsh_init and borsh_skip (the former one not available in Serde).

borsh_init allows to automatically run an initialization function right after deserialization. This adds a lot of convenience for objects that are architectured to be used as strictly immutable. Usage example:

```rust

[derive(BorshSerialize, BorshDeserialize)]

[borsh_init(init)]

struct Message { message: String, timestamp: u64, public_key: CryptoKey, signature: CryptoSignature hash: CryptoHash }

impl Message { pub fn init(&mut self) { self.hash = CryptoHash::new().writestring(self.message).writeu64(self.timestamp); self.signature.verify(self.hash, self.public_key); } } ```

borsh_skip allows to skip serializing/deserializing fields, assuming they implement Default trait, similary to #[serde(skip)].

```rust

[derive(BorshSerialize, BorshDeserialize)]

struct A { x: u64, #[borsh_skip] y: f32, } ```

Releasing

After you merged your change into the master branch and bumped the versions of all three crates it is time to officially release the new version.

Make sure borsh, borsh-derive, borsh-derive-internal, and borsh-schema-derive-internal all have the new crate versions. Then run the publish.sh script:

bash sh publish.sh

Make sure you are on the master branch, then tag the code and push the tag:

bash git tag -a v9.9.9 -m "My superawesome change." git push origin v9.9.9

License

This repository is distributed under the terms of both the MIT license and the Apache License (Version 2.0). See LICENSE-MIT and LICENSE-APACHE for details.