Custom NetworkVariable not syncing

Here is code of my implementation of custom network variable. I am trying to sync array of character bones. Size of array of Bones is fixed.
Client writes values, server reads. Problem is that ReadField or ReadDelta did not run on server side.

using System;
using Unity.Netcode;
using UnityEngine;

[Serializable]
public class NetworkBoneArray : NetworkVariableBase
{
    private Bone[] _bones;

    public Bone this[int i]
    {
        get => _bones[i];
        set
        {
            _bones[i] = value;
            SetDirty(true);
        }
    }

    public NetworkBoneArray(int count, NetworkVariableReadPermission readPerm = DefaultReadPerm,
        NetworkVariableWritePermission writePerm = DefaultWritePerm) : base(readPerm, writePerm)
    {
        _bones = new Bone[count];
    }

    public override void WriteField(FastBufferWriter writer)
    {
        Debug.Log("Write field");
        for (var i = 0; i < _bones.Length; i++)
        {
            var bone = _bones[i];
            writer.WriteValueSafe(bone.LocalPosition);
            writer.WriteValueSafe(bone.LocalRotation);
        }
    }

    public override void ReadField(FastBufferReader reader)
    {
        Debug.Log("Read field");
        for (var i = 0; i < _bones.Length; i++)
        {
            var bone = new Bone();
            reader.ReadValueSafe(out bone.LocalPosition);
            reader.ReadValueSafe(out bone.LocalRotation);
            _bones[i] = bone;
        }
    }

    public override void ReadDelta(FastBufferReader reader, bool keepDirtyDelta)
    {
        Debug.Log("Read Delta");
        ReadField(reader);
    }

    public override void WriteDelta(FastBufferWriter writer)
    {
        Debug.Log("Write Delta");
        WriteField(writer);
    }
}

public struct Bone
{
    public Vector3 LocalPosition;
    public Quaternion LocalRotation;

    public static implicit operator Bone(Transform t)
    {
        return new Bone {LocalPosition = t.localPosition, LocalRotation = t.localRotation};
    }
}

public class BodySync : NetworkBehaviour
{
    [SerializeField] private Transform[] Bones;

    public NetworkBoneArray NetworkBones;

    public void Awake()
    {
        NetworkBones = new NetworkBoneArray(Bones.Length, writePerm: NetworkVariableWritePermission.Owner);
        NetworkBones.Initialize(this);
    }

    void Update()
    {
        if (IsOwner)
        {
            for (var i = 0; i < Bones.Length; i++)
            {
                NetworkBones[i] = Bones[i];
            }
            NetworkBones.SetDirty(true);
        }
        else
        {
            for (var i = 0; i < Bones.Length; i++)
            {
                SetBoneToTransform(Bones[i], NetworkBones[i]);
            }
        }
    }

    private static void SetBoneToTransform(Transform transform, Bone bone)
    {
        transform.localPosition = bone.LocalPosition;
        transform.localRotation = bone.LocalRotation;
    }
}

What am i doing wrong?

Ups… it was fault not related to this code. Code works fine.