borsh-derive-internal 0.8.2

Binary Object Representation Serializer for Hashing
# Borsh in Rust   [![Build Status]][travis-ci] [![Latest Version]][] [![borsh: rustc 1.40+]][Rust 1.40] [![License Apache-2.0 badge]][License Apache-2.0] [![License MIT badge]][License MIT]

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

**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][Borsh], and comes with a
strict [specification](

## Example

use borsh::{BorshSerialize, BorshDeserialize};

#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug)]
struct A {
    x: u64,
    y: String,

fn test_simple_struct() {
    let a = A {
        x: 3301,
        y: "liber primus".to_string(),
    let encoded_a = a.try_to_vec().unwrap();
    let decoded_a = A::try_from_slice(&encoded_a).unwrap();
    assert_eq!(a, decoded_a);

## 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:

#[derive(BorshSerialize, BorshDeserialize)]
struct Message {
    message: String,
    timestamp: u64,
    public_key: CryptoKey,
    signature: CryptoSignature
    hash: CryptoHash

impl Message {
    pub fn init(&mut self) {
        self.hash = CryptoHash::new().write_string(self.message).write_u64(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)]`.

#[derive(BorshSerialize, BorshDeserialize)]
struct A {
    x: u64,
    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 `` script:


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

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).