/// <summary> /// /// </summary> /// <param name="obj"></param> /// <param name="rootObjectFieldDescriptor"></param> /// <param name="binaryWriter"></param> /// <param name="translationContext"></param> private void Serialize(object obj, FieldDescriptor rootObjectFieldDescriptor, BinaryWriter binaryWriter, TranslationContext translationContext) { if (AlreadySerialized(obj, translationContext)) { WriteSimplRef(obj, rootObjectFieldDescriptor, binaryWriter); return; } translationContext.MapObject(obj); SerializationPreHook(obj, translationContext); ClassDescriptor rootObjectClassDescriptor = GetClassDescriptor(obj); MemoryStream bufferMemoryStream = new MemoryStream(); BinaryWriter outputBuffer = new BinaryWriter(bufferMemoryStream); IEnumerable<FieldDescriptor> allFieldDescriptors = GetClassDescriptor(obj).AllFieldDescriptors; SerializeFields(obj, outputBuffer, translationContext, allFieldDescriptors.ToList()); WriteHeader(binaryWriter, bufferMemoryStream, rootObjectFieldDescriptor.TlvId); SerializationPostHook(obj, translationContext); }
/// <summary> /// /// </summary> /// <param name="obj"></param> /// <param name="rootObjectFieldDescriptor"></param> /// <param name="textWriter"></param> /// <param name="translationContext"></param> /// <param name="withTag"></param> private void Serialize(object obj, FieldDescriptor rootObjectFieldDescriptor, TextWriter textWriter, TranslationContext translationContext, bool withTag) { if (obj == null) return; if (AlreadySerialized(obj, translationContext)) { WriteSimplRef(obj, rootObjectFieldDescriptor, textWriter, withTag, translationContext); return; } translationContext.MapObject(obj); SerializationPreHook(obj, translationContext); WriteObjectStart(rootObjectFieldDescriptor, textWriter, withTag); ClassDescriptor cd = GetClassDescriptor(obj); SerializeFields(obj, textWriter, translationContext, cd); WriteClose(textWriter); SerializationPostHook(obj, translationContext); }
/// <summary> /// /// </summary> /// <param name="obj"></param> /// <param name="rootObjectFieldDescriptor"></param> /// <param name="textWriter"></param> /// <param name="translationContext"></param> private void Serialize(object obj, FieldDescriptor rootObjectFieldDescriptor, TextWriter textWriter, TranslationContext translationContext) { if (obj == null) return; if (AlreadySerialized(obj, translationContext)) { WriteSimplRef(obj, rootObjectFieldDescriptor, textWriter, translationContext); return; } translationContext.MapObject(obj); SerializationPreHook(obj, translationContext); WriteObjectStart(rootObjectFieldDescriptor, textWriter); ClassDescriptor rootObjectClassDescriptor = GetClassDescriptor(obj); SerializedAttributes(obj, textWriter, translationContext, rootObjectClassDescriptor); List<FieldDescriptor> elementFieldDescriptors = rootObjectClassDescriptor.ElementFieldDescriptors; Boolean hasXmlText = rootObjectClassDescriptor.HasScalarTextField; Boolean hasElements = elementFieldDescriptors.Count > 0; if (!hasElements && !hasXmlText) { WriteCompleteClose(textWriter); } else { WriteClose(textWriter); if (hasXmlText) { WriteValueAsText(obj, rootObjectClassDescriptor.ScalarTextFD, textWriter); } SerializeFields(obj, textWriter, translationContext, elementFieldDescriptors); WriteObjectClose(rootObjectFieldDescriptor, textWriter); } }