/// <summary> /// Serialize a class /// </summary> /// <param name="type">The type</param> /// <param name="propertyName">The name of the property.</param> /// <param name="foreignTable">The referenced type</param> /// <param name="bw">The writer</param> /// <param name="cache">Cycle cache</param> private void _SerializeClass(Type type, string propertyName, object foreignTable, BinaryWriter bw, CycleCache cache) { bw.Write(propertyName + PROPERTY_VALUE_SEPARATOR); bw.Write(_typeResolver(type.AssemblyQualifiedName)); // serialize to the stream if the foreign key is nulled _SerializeNull(bw, foreignTable == null); if (foreignTable == null) { return; } var foreignKey = _database.Save(foreignTable.GetType(), foreignTable.GetType(), foreignTable, cache); // need to be able to serialize the key if (!_serializer.CanSerialize(foreignKey.GetType())) { var exception = new SterlingSerializerException(_serializer, foreignKey.GetType()); _logManager.Log(SterlingLogLevel.Error, exception.Message, exception); throw exception; } _logManager.Log(SterlingLogLevel.Verbose, string.Format( "Sterling is saving foreign key of type {0} with value {1} for parent {2}", foreignKey.GetType().FullName, foreignKey, type.FullName), null); _serializer.Serialize(foreignKey, bw); }
/// <summary> /// Serialize a class /// </summary> /// <param name="type">The type</param> /// <param name="propertyName">The name of the property.</param> /// <param name="foreignTable">The referenced type</param> /// <param name="bw">The writer</param> /// <param name="cache">Cycle cache</param> private void _SerializeClass(Type type, string propertyName, object foreignTable, BinaryWriter bw, CycleCache cache) { bw.Write(propertyName + PROPERTY_VALUE_SEPARATOR); bw.Write(_typeResolver(type.AssemblyQualifiedName)); // serialize to the stream if the foreign key is nulled _SerializeNull(bw, foreignTable == null); if (foreignTable == null) { return; } var task = _databaseInstance._Save <object>(foreignTable.GetType(), foreignTable.GetType(), foreignTable, cache); //TODO: fix this if (task.Wait(TimeSpan.FromSeconds(10)) == false) { throw new TimeoutException("Foreign key save operation failed to complete in 10 seconds."); } var foreignKey = task.Result; // need to be able to serialize the key if (!_serializer.CanSerialize(foreignKey.GetType())) { var exception = new SterlingSerializerException(_serializer, foreignKey.GetType()); _logManager.Log(SterlingLogLevel.Error, exception.Message, exception); throw exception; } _logManager.Log(SterlingLogLevel.Verbose, string.Format( "Sterling is saving foreign key of type {0} with value {1} for parent {2}", foreignKey.GetType().FullName, foreignKey, type.FullName), null); _serializer.Serialize(foreignKey, bw); }