title: Microsoft Bond schema evolution best practices
body: <p>Does Microsoft Bond have some best practices on how schemas evolve over time?  I want to make certain we follow best practices such that we have 2 way compatibility (i.e. allowing our Bond types to evolve older versions to the current version, as well as backward compatibility allowing conversion from a newer version back to an older version).  I don't see this addressed specifically in the documentation (e.g. <a href="https://microsoft.github.io/bond/manual/bond_cs.html" rel="nofollow noreferrer">https://microsoft.github.io/bond/manual/bond_cs.html</a> nor <a href="https://microsoft.github.io/bond/manual/compiler.html#idl-syntax" rel="nofollow noreferrer">https://microsoft.github.io/bond/manual/compiler.html#idl-syntax</a> ), though other serialization frameworks such as Avro have this explicitly detailed in their documentation.</p>
  
  <p>For what it's worth, we are writing in .NET (C#/F#) and intend to use the CompactBinaryWriter and CompactBinaryReader formats initially.</p>
  
  <p>For example, I imagine some guidance along these lines:</p>
  
  <ol>
  <li>names of fields can change over time since the field ordinals are used for field resolution, not the names directly (except in SimpleJSON).  I believe this true, is it?</li>
  <li>adding a new "required" field requires you give the field a default value</li>
  <li>removing a field in a newer version is okay, provided older versions had a default value assigned</li>
  <li>what about changing the type of a field?  For example, can a field change from an string field in version 1 to a int64 in version 2? Can it change from a string to a custom union (custom type with optional fields)?</li>
  <li>any other recommendations?</li>
  </ol>
  
  <p>Thank you!</p>
  
  <p>would also be interested if there is any active forum community for this type of Microsoft Bond question, i wasn't able to find one...</p>