public void TestNestedMessageArray() { JsonFormatWriter writer = JsonFormatWriter.CreateInstance(); using (writer.StartArray()) { using (writer.StartArray()) { writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(1).AddTextlines("a").Build()); writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(2).AddTextlines("b").Build()); } using (writer.StartArray()) writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(3).AddTextlines("c").Build()); } string json = writer.ToString(); JsonFormatReader reader = JsonFormatReader.CreateInstance(json); TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder(); int ordinal = 0; foreach (JsonFormatReader r in reader.EnumerateArray()) { foreach (JsonFormatReader r2 in r.EnumerateArray()) { r2.Merge(builder); Assert.AreEqual(++ordinal, builder.Number); } } Assert.AreEqual(3, ordinal); Assert.AreEqual(3, builder.TextlinesCount); }
public void TestMessageMissingExtensions() { TestXmlMessage original = TestXmlMessage.CreateBuilder() .SetValid(true) .SetText("text") .SetExtension(UnittestExtrasXmltest.ExtensionText, " extension text value ! ") .SetExtension(UnittestExtrasXmltest.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build()) .AddExtension(UnittestExtrasXmltest.ExtensionNumber, 100) .AddExtension(UnittestExtrasXmltest.ExtensionNumber, 101) .AddExtension(UnittestExtrasXmltest.ExtensionNumber, 102) .SetExtension(UnittestExtrasXmltest.ExtensionEnum, EnumOptions.ONE) .Build(); TestXmlMessage message = original.ToBuilder() .ClearExtension(UnittestExtrasXmltest.ExtensionText) .ClearExtension(UnittestExtrasXmltest.ExtensionMessage) .ClearExtension(UnittestExtrasXmltest.ExtensionNumber) .ClearExtension(UnittestExtrasXmltest.ExtensionEnum) .Build(); JsonFormatWriter writer = JsonFormatWriter.CreateInstance(); writer.WriteMessage(original); Content = writer.ToString(); IMessageLite copy = JsonFormatReader.CreateInstance(Content) .Merge(message.CreateBuilderForType()).Build(); Assert.AreNotEqual(original, message); Assert.AreNotEqual(original, copy); Assert.AreEqual(message, copy); }
/// <summary> /// Serializes the message to JSON text. This is a trivial wrapper /// around Serialization.JsonFormatWriter.WriteMessage. /// </summary> public static string ToJson( #if !NOEXTENSIONS this #endif IMessageLite message) { JsonFormatWriter w = JsonFormatWriter.CreateInstance(); w.WriteMessage(message); return(w.ToString()); }
// Thank you Unity for invoke "support" private void SaveServerManualWithoutInvoke(object sender, DoWorkEventArgs e) { try { //s.DoSave(ref builder); SaveScene(ref builder); SaveInstances(ref builder); timestamp2.Stop(); timestamp3 = SystemTimestamp.Restart; fsave = builder.Build(); timestamp3.Stop(); int num = fsave.SceneObjectCount + fsave.InstanceObjectCount; if (save.friendly) { using (FileStream stream = File.Open(path + ".json", FileMode.Create, FileAccess.Write)) { JsonFormatWriter writer = JsonFormatWriter.CreateInstance(stream); writer.Formatted(); writer.WriteMessage(fsave); } } SystemTimestamp timestamp5 = timestamp4 = SystemTimestamp.Restart; using (FileStream stream2 = File.Open(path + ".new", FileMode.Create, FileAccess.Write)) { fsave.WriteTo(stream2); stream2.Flush(); } timestamp4.Stop(); if (File.Exists(path + ".old." + (SaveCopies + 1))) { File.Delete(path + ".old." + (SaveCopies + 1)); } for (int i = SaveCopies; i >= 0; i--) { if (File.Exists(path + ".old." + i)) { File.Move(path + ".old." + i, path + ".old." + (i + 1)); } } if (File.Exists(path)) { File.Move(path, path + ".old.0"); } if (File.Exists(path + ".new")) { File.Move(path + ".new", path); } timestamp5.Stop(); restart.Stop(); if (Hooks.IsShuttingDown) { ServerIsSaving = false; Logger.Log(string.Concat(new object[] { " Saved ", num, " Object(s). Took ", restart.ElapsedSeconds, " seconds." })); return; } Loom.QueueOnMainThread(() => { if (save.profile) { object[] args = new object[] { num, timestamp2.ElapsedSeconds, timestamp2.ElapsedSeconds / restart.ElapsedSeconds, timestamp3.ElapsedSeconds, timestamp3.ElapsedSeconds / restart.ElapsedSeconds, timestamp4.ElapsedSeconds, timestamp4.ElapsedSeconds / restart.ElapsedSeconds, timestamp5.ElapsedSeconds, timestamp5.ElapsedSeconds / restart.ElapsedSeconds, restart.ElapsedSeconds, restart.ElapsedSeconds / restart.ElapsedSeconds }; Logger.Log(string.Format( " Saved {0} Object(s) [times below are in elapsed seconds]\r\n Logic:\t{1,-16:0.000000}\t{2,7:0.00%}\r\n Build:\t{3,-16:0.000000}\t{4,7:0.00%}\r\n Stream:\t{5,-16:0.000000}\t{6,7:0.00%}\r\n All IO:\t{7,-16:0.000000}\t{8,7:0.00%}\r\n Total:\t{9,-16:0.000000}\t{10,7:0.00%}", args)); } else { Logger.Log(string.Concat(new object[] { " Saved ", num, " Object(s). Took ", restart.ElapsedSeconds, " seconds." })); } Hooks.OnServerSaveEvent(num, restart.ElapsedSeconds); ServerIsSaving = false; LastSaveTime = DateTime.Now; // Process the unprocessed hashset values here without causing HashSet modified error. List <ServerSave> RemovableKeys = new List <ServerSave>(); foreach (ServerSave x in UnProcessedSaves.Keys) { try { if (UnProcessedSaves.ContainsKey(x)) { byte value = UnProcessedSaves[x]; if (value == 1) { if (ServerSaveManager.Instances.registers.Add(x)) { ServerSaveManager.Instances.ordered.Add(x); } ServerSaveManager.Instances.ordered.Add(x); } else { if (ServerSaveManager.Instances.registers.Remove(x)) { ServerSaveManager.Instances.ordered.Remove(x); } } RemovableKeys.Add(x); } } catch (KeyNotFoundException ex) { Logger.LogError("[RegisterHook KeyNotFoundException] " + ex); } catch (Exception ex) { Logger.LogError("[RegisterHook Error] " + ex); } } foreach (var x in RemovableKeys) { UnProcessedSaves.Remove(x); } }); } catch (Exception ex) { Logger.LogError("[ServerSaveHandler Error 0x2] " + ex); ServerIsSaving = false; LastSaveTime = DateTime.Now; NextServerSaveTime = LastSaveTime.AddMinutes(ServerSaveTime); if (StopServerOnSaveFail) { Logger.LogWarning("[Fougerite WorldSave] We have caught an error. Killing server as requested."); Process.GetCurrentProcess().Kill(); } } }