public string SerializeToString()
        {
            if (factionDatabase == null)
            {
                return(string.Empty);
            }

            var sb = new StringBuilder();

            // Record faction count:
            sb.AppendFormat("{0},", factionDatabase.factions.Length);

            for (int f = 0; f < factionDatabase.factions.Length; f++)
            {
                var faction = factionDatabase.factions[f];

                // Record faction ID and name:
                sb.AppendFormat("{0},{1},", faction.id, SafeConvert.ToSerializedElement(faction.name));

                // Record faction personality trait values:
                for (int p = 0; p < faction.traits.Length; p++)
                {
                    sb.AppendFormat("{0},", faction.traits[p]);
                }

                // Record faction parents:
                sb.AppendFormat("{0},", faction.parents.Length);
                for (int p = 0; p < faction.parents.Length; p++)
                {
                    var parentID = faction.parents[p];
                    sb.AppendFormat("{0},", parentID);
                }

                // Record faction relationships:
                sb.AppendFormat("{0},", faction.relationships.Count);
                for (int r = 0; r < faction.relationships.Count; r++)
                {
                    var relationship = faction.relationships[r];
                    // Record relationship faction ID:
                    sb.AppendFormat("{0},{1},", relationship.factionID, (relationship.inheritable ? 1 : 0));
                    // Record relationship trait values:
                    for (int t = 0; t < factionDatabase.relationshipTraitDefinitions.Length; t++)
                    {
                        sb.AppendFormat("{0},", relationship.traits[t]);
                    }
                }
            }
            return(sb.ToString());
        }