/// <summary>Save one inode's attributes to the image.</summary>
 /// <exception cref="System.IO.IOException"/>
 public static void SaveINode2Image(INode node, DataOutput @out, bool writeUnderConstruction
                                    , SnapshotFSImageFormat.ReferenceMap referenceMap)
 {
     if (node.IsReference())
     {
         WriteINodeReference(node.AsReference(), @out, writeUnderConstruction, referenceMap
                             );
     }
     else
     {
         if (node.IsDirectory())
         {
             WriteINodeDirectory(node.AsDirectory(), @out);
         }
         else
         {
             if (node.IsSymlink())
             {
                 WriteINodeSymlink(node.AsSymlink(), @out);
             }
             else
             {
                 if (node.IsFile())
                 {
                     WriteINodeFile(node.AsFile(), @out, writeUnderConstruction);
                 }
             }
         }
     }
 }
        /// <summary>
        /// Serialize a
        /// <see cref="INodeReference"/>
        /// node
        /// </summary>
        /// <exception cref="System.IO.IOException"/>
        private static void WriteINodeReference(INodeReference @ref, DataOutput @out, bool
                                                writeUnderConstruction, SnapshotFSImageFormat.ReferenceMap referenceMap)
        {
            WriteLocalName(@ref, @out);
            @out.WriteLong(@ref.GetId());
            @out.WriteShort(0);
            // replication
            @out.WriteLong(0);
            // modification time
            @out.WriteLong(0);
            // access time
            @out.WriteLong(0);
            // preferred block size
            @out.WriteInt(-3);
            // # of blocks
            bool isWithName = @ref is INodeReference.WithName;

            @out.WriteBoolean(isWithName);
            if (!isWithName)
            {
                Preconditions.CheckState(@ref is INodeReference.DstReference);
                // dst snapshot id
                @out.WriteInt(((INodeReference.DstReference)@ref).GetDstSnapshotId());
            }
            else
            {
                @out.WriteInt(((INodeReference.WithName)@ref).GetLastSnapshotId());
            }
            INodeReference.WithCount withCount = (INodeReference.WithCount)@ref.GetReferredINode
                                                     ();
            referenceMap.WriteINodeReferenceWithCount(withCount, @out, writeUnderConstruction
                                                      );
        }