public static MyObjectBuilder_Base Clone(MyObjectBuilder_Base toClone) { MyObjectBuilder_Base clone = null; using (var stream = new MemoryStream()) { SerializeXMLInternal(stream, toClone); stream.Position = 0; DeserializeXML(stream, out clone, toClone.GetType()); } return(clone); }
/// <summary> /// Performs shallow copy of data between members of the same name and type from source to target. /// This method can be slow and inefficient, so use only when needed. /// </summary> public static void MemberwiseAssignment(MyObjectBuilder_Base source, MyObjectBuilder_Base target) { var sourceFields = source.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.GetProperty); var targetFields = target.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetField | BindingFlags.SetProperty); foreach (var sourceField in sourceFields) { var targetField = targetFields.FirstOrDefault(delegate(FieldInfo fieldInfo) { return(fieldInfo.FieldType == sourceField.FieldType && fieldInfo.Name == sourceField.Name); }); if (targetField == default(FieldInfo)) { continue; } targetField.SetValue(target, sourceField.GetValue(source)); } }
private static void SerializeXMLInternal(Stream writeTo, MyObjectBuilder_Base objectBuilder, Type serializeAsType = null) { XmlSerializer serializer = m_serializersByType[serializeAsType ?? objectBuilder.GetType()]; serializer.Serialize(writeTo, objectBuilder); }
public static bool SerializeXML(string path, bool compress, MyObjectBuilder_Base objectBuilder, out ulong sizeInBytes, Type serializeAsType = null) { try { using (var fileStream = MyFileSystem.OpenWrite(path)) using (var writeStream = compress ? fileStream.WrapGZip() : fileStream) { long startPos = fileStream.Position; XmlSerializer serializer = m_serializersByType[serializeAsType ?? objectBuilder.GetType()]; serializer.Serialize(writeStream, objectBuilder); sizeInBytes = (ulong)(fileStream.Position - startPos); // Length of compressed stream } } catch (Exception e) { MyLog.Default.WriteLine("Error: " + path + " failed to serialize."); MyLog.Default.WriteLine(e.ToString()); #if DEBUG var io = e as IOException; if (io != null && io.IsFileLocked()) { MyLog.Default.WriteLine("Files is locked during saving."); MyLog.Default.WriteLine("Xml file locks:"); try { foreach (var p in Win32Processes.GetProcessesLockingFile(path)) { MyLog.Default.WriteLine(p.ProcessName); } } catch (Exception e2) { MyLog.Default.WriteLine(e2); } } #endif sizeInBytes = 0; return(false); } return(true); }
private static void SerializeXMLInternal(Stream writeTo, MyObjectBuilder_Base objectBuilder, Type serializeAsType = null) { XmlSerializer serializer = MyXmlSerializerManager.GetSerializer(serializeAsType ?? objectBuilder.GetType()); serializer.Serialize(writeTo, objectBuilder); }