• DataContractSerializer on mono returns weird errors
    2 replies, posted
I have made a simple data serializer to just serialize my data on it, There's so simple ways to serialize and deserialize the data, I got two ways to do that: [code] public string Serialize() { SerializedData data = new SerializedData(this); DataContractSerializer serializer = new DataContractSerializer(typeof(SerializedData)); System.IO.MemoryStream s = new System.IO.MemoryStream(); serializer.WriteObject(s, data); return Convert.ToBase64String(s.ToArray()); } public static MessageBlock Deserialize(string name, string sdata, Map map) { byte[] bdata = Convert.FromBase64String(sdata); MessageBlock MessageBlock = new MessageBlock(); DataContractSerializer serializer = new DataContractSerializer(typeof(SerializedData)); System.IO.MemoryStream s = new System.IO.MemoryStream(bdata); SerializedData data = (SerializedData)serializer.ReadObject(s); data.UpdateMessageBlock(MessageBlock); return MessageBlock; } [DataContract] private class SerializedData { [DataMember] public String Name; [DataMember] public String Creator; [DataMember] public DateTime Created; [DataMember] public String World; [DataMember] public Vector3I AffectedBlock; [DataMember] public int XMin; [DataMember] public int XMax; [DataMember] public int YMin; [DataMember] public int YMax; [DataMember] public int ZMin; [DataMember] public int ZMax; [DataMember] public String Message; public SerializedData(MessageBlock MessageBlock) { lock (MessageBlock) { Name = MessageBlock.Name; Creator = MessageBlock.Creator; Created = MessageBlock.Created; World = MessageBlock.World; AffectedBlock = MessageBlock.AffectedBlock; XMin = MessageBlock.Range.Xmin; XMax = MessageBlock.Range.Xmax; YMin = MessageBlock.Range.Ymin; YMax = MessageBlock.Range.Ymax; ZMin = MessageBlock.Range.Zmin; ZMax = MessageBlock.Range.Zmax; Message = MessageBlock.Message; } } public void UpdateMessageBlock(MessageBlock MessageBlock) { MessageBlock.Name = Name; MessageBlock.Creator = Creator; MessageBlock.Created = Created; MessageBlock.World = World; MessageBlock.AffectedBlock = AffectedBlock; MessageBlock.Range = new MessageBlockRange(XMin, XMax, YMin, YMax, ZMin, ZMax); MessageBlock.Message = Message; } } [/code] Server i run code on it is ubuntu using mono 3.2.1, There's no problem for windows, I can run codes easily without any error on windows NET 4, But it seems like mono doesn't support DataContractSerializer, The error i get on mono is: [code] 09:04:19 > ERROR: Map failed to save: System.Runtime.Serialization.SerializationException: Circular reference of an object in the object graph was found: '(0,0,-1)' of type fCraft.Vector3I at System.Runtime.Serialization.SerializationMap.Serialize (System.Object graph, System.Runtime.Serialization.XmlFormatterSerializer serializer) [0x00000] in :0 at System.Runtime.Serialization.XmlFormatterSerializer.Serialize (System.Type type, System.Object graph) [0x00000] in :0 at System.Runtime.Serialization.SerializationMap.SerializeNonReference (System.Object graph, System.Runtime.Serialization.XmlFormatterSerializer serializer) [0x00000] in :0 at System.Runtime.Serialization.SerializationMap.Serialize (System.Object graph, System.Runtime.Serialization.XmlFormatterSerializer serializer) [0x00000] in :0 at System.Runtime.Serialization.XmlFormatterSerializer.Serialize (System.Type type, System.Object graph) [0x00000] in :0 at System.Runtime.Serialization.SerializationMap.SerializeNonReference (System.Object graph, System.Runtime.Serialization.XmlFormatterSerializer serializer) [0x00000] in :0 at System.Runtime.Serialization.SerializationMap.Serialize (System.Object graph, System.Runtime.Serialization.XmlFormatterSerializer serializer) [0x00000] in :0 at System.Runtime.Serialization.XmlFormatterSerializer.Serialize (System.Type type, System.Object graph) [0x00000] in :0 at System.Runtime.Serialization.SerializationMap.SerializeNonReference (System.Object graph, System.Runtime.Serialization.XmlFormatterSerializer serializer) [0x00000] in :0 at System.Runtime.Serialization.SerializationMap.Serialize (System.Object graph, System.Runtime.Serialization.XmlFormatterSerializer serializer) [0x00000] in :0 at System.Runtime.Serialization.XmlFormatterSerializer.Serialize (System.Type type, System.Object graph) [0x00000] in :0 at System.Runtime.Serialization.XmlFormatterSerializer.Serialize (System.Xml.XmlDictionaryWriter writer, System.Object graph, System.Type declaredType, System.Runtime.Serialization.KnownTypeCollection types, Boolean ignoreUnknown, Int32 maxItems, System.String root_ns, Boolean preserveObjectReferences, System.Runtime.Serialization.DataContractResolver resolver, System.Runtime.Serialization.DataContractResolver defaultResolver) [0x00000] in :0 at System.Runtime.Serialization.DataContractSerializer.WriteObjectContent (System.Xml.XmlDictionaryWriter writer, System.Object graph) [0x00000] in :0 at System.Runtime.Serialization.XmlObjectSerializer.WriteObject (System.Xml.XmlDictionaryWriter writer, System.Object graph) [0x00000] in :0 at System.Runtime.Serialization.DataContractSerializer.WriteObject (System.Xml.XmlWriter writer, System.Object graph) [0x00000] in :0 at System.Runtime.Serialization.XmlObjectSerializer.WriteObject (System.IO.Stream stream, System.Object graph) [0x00000] in :0 at fCraft.MessageBlock.Serialize () [0x00000] in :0 at fCraft.MessageBlockSerialization.Serialize (fCraft.Map map, System.IO.Stream stream, IMapConverterEx converter) [0x00000] in :0 at fCraft.MapConversion.MapFCMv3+<>c_DisplayClass4.b_2 (IConverterExtension ex) [0x00000] in :0 at System.Linq.Enumerable.Sum[IConverterExtension] (IEnumerable1 source, System.Func2 selector) [0x00000] in :0 at fCraft.MapConversion.MapFCMv3.WriteMetadata (System.IO.Stream stream, fCraft.Map map) [0x00000] in :0 at fCraft.MapConversion.MapFCMv3.Save (fCraft.Map mapToSave, System.String fileName) [0x00000] in :0 at fCraft.MapConversion.MapUtility.TrySave (fCraft.Map mapToSave, System.String fileName, MapFormat format) [0x00000] in :0 09:04:19 > Warning: Logger.SubmitCrashReport: System.UriFormatException: Uri is longer than the maximum 32766 characters. at System.Uri.EscapeDataString (System.String stringToEscape) [0x00000] in :0 at fCraft.Logger.LogAndReportCrashInner (System.String message, System.String assembly, System.Exception exception) [0x00000] in :0 [/code]
[url]http://stackoverflow.com/questions/3281157/does-mono-support-datacontractserializer-with-the-preserveobjectreferences-flag[/url]
Doesn't seems to work fine, There must be a problem, in windows it works perfect.
Sorry, you need to Log In to post a reply to this thread.