private static ObjectData CreateObjectData(INakedObject nakedObject, bool ensurePersistent) { Log.DebugFormat("Compiling object data for {0}", nakedObject); var data = new ObjectData(nakedObject.Specification, nakedObject.Oid, nakedObject.Version); foreach (INakedObjectAssociation fieldAssoc in nakedObject.Specification.Properties) { if (!fieldAssoc.IsPersisted) { continue; } INakedObject field = fieldAssoc.GetNakedObject(nakedObject); string fieldId = fieldAssoc.Id; if (fieldAssoc.IsCollection) { data.AddInternalCollection(field, fieldId, ensurePersistent); } if (fieldAssoc.IsInline) { data.AddInline(CreateObjectData(field, ensurePersistent), fieldId); } else if (fieldAssoc.Specification.IsEncodeable) { bool isEmpty = fieldAssoc.IsEmpty(nakedObject); if (field == null || isEmpty) { data.SaveValue(fieldId, isEmpty, null); } else { var facet = field.Specification.GetFacet <IEncodeableFacet>(); string encodedValue = facet.ToEncodedString(field); data.SaveValue(fieldId, isEmpty, encodedValue); } } else if (fieldAssoc.IsObject) { data.AddAssociation(field, fieldId, ensurePersistent); } } return(data); }