234 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			234 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using System.Collections.Generic; | |||
|  | using System.Collections; | |||
|  | using System.IO; | |||
|  | using System; | |||
|  | using UnityEngine; | |||
|  | using System.Text; | |||
|  | using System.Globalization; | |||
|  | 
 | |||
|  | namespace ES3Internal | |||
|  | { | |||
|  | 	internal class ES3JSONWriter : ES3Writer | |||
|  | 	{ | |||
|  | 		internal StreamWriter baseWriter; | |||
|  | 
 | |||
|  | 		private bool isFirstProperty = true; | |||
|  | 
 | |||
|  | 		public ES3JSONWriter(Stream stream, ES3Settings settings) : this(stream, settings, true, true){} | |||
|  | 
 | |||
|  | 		internal ES3JSONWriter(Stream stream, ES3Settings settings, bool writeHeaderAndFooter, bool mergeKeys) : base(settings, writeHeaderAndFooter, mergeKeys) | |||
|  | 		{ | |||
|  | 			baseWriter = new StreamWriter(stream); | |||
|  | 			StartWriteFile(); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		#region WritePrimitive(value) methods. | |||
|  | 
 | |||
|  | 		internal override void WritePrimitive(int value)		{ baseWriter.Write(value); } | |||
|  | 		internal override void WritePrimitive(float value)	{ baseWriter.Write(value.ToString("R", CultureInfo.InvariantCulture)); } | |||
|  | 		internal override void WritePrimitive(bool value)		{ baseWriter.Write(value ? "true" : "false"); } | |||
|  | 		internal override void WritePrimitive(decimal value)	{ baseWriter.Write(value.ToString(CultureInfo.InvariantCulture)); } | |||
|  | 		internal override void WritePrimitive(double value)	{ baseWriter.Write(value.ToString("R", CultureInfo.InvariantCulture)); } | |||
|  | 		internal override void WritePrimitive(long value)		{ baseWriter.Write(value); } | |||
|  | 		internal override void WritePrimitive(ulong value)	{ baseWriter.Write(value); } | |||
|  | 		internal override void WritePrimitive(uint value)		{ baseWriter.Write(value); } | |||
|  | 		internal override void WritePrimitive(byte value)		{ baseWriter.Write(System.Convert.ToInt32(value)); } | |||
|  | 		internal override void WritePrimitive(sbyte value)	{ baseWriter.Write(System.Convert.ToInt32(value)); } | |||
|  | 		internal override void WritePrimitive(short value)	{ baseWriter.Write(System.Convert.ToInt32(value)); } | |||
|  | 		internal override void WritePrimitive(ushort value)	{ baseWriter.Write(System.Convert.ToInt32(value)); } | |||
|  | 		internal override void WritePrimitive(char value)		{ WritePrimitive( value.ToString() ); } | |||
|  | 		internal override void WritePrimitive(byte[] value)		{ WritePrimitive( System.Convert.ToBase64String(value) ); } | |||
|  | 
 | |||
|  | 
 | |||
|  | 		internal override void WritePrimitive(string value) | |||
|  | 		{  | |||
|  | 			baseWriter.Write("\""); | |||
|  | 
 | |||
|  | 			// Escape any quotation marks within the string. | |||
|  | 			for(int i = 0; i<value.Length; i++) | |||
|  | 			{ | |||
|  | 				char c = value[i]; | |||
|  | 				switch(c) | |||
|  | 				{ | |||
|  | 					case '\"': | |||
|  | 					case '“': | |||
|  | 					case '”': | |||
|  | 					case '\\': | |||
|  | 					case '/': | |||
|  | 						baseWriter.Write('\\'); | |||
|  | 						baseWriter.Write(c); | |||
|  | 						break; | |||
|  | 					case '\b': | |||
|  | 						baseWriter.Write("\\b"); | |||
|  | 						break; | |||
|  | 					case '\f': | |||
|  | 						baseWriter.Write("\\f"); | |||
|  | 						break; | |||
|  | 					case '\n': | |||
|  | 						baseWriter.Write("\\n"); | |||
|  | 						break; | |||
|  | 					case '\r': | |||
|  | 						baseWriter.Write("\\r"); | |||
|  | 						break; | |||
|  | 					case '\t': | |||
|  | 						baseWriter.Write("\\t"); | |||
|  | 						break; | |||
|  | 					default: | |||
|  | 						baseWriter.Write(c); | |||
|  | 						break; | |||
|  | 				} | |||
|  | 			} | |||
|  | 			baseWriter.Write("\""); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void WriteNull() | |||
|  | 		{ | |||
|  | 			baseWriter.Write("null"); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		#endregion | |||
|  | 
 | |||
|  | 		#region Format-specific methods | |||
|  | 
 | |||
|  | 		private static bool CharacterRequiresEscaping(char c) | |||
|  | 		{ | |||
|  | 			return c == '\"' || c == '\\' || c == '“' || c == '”'; | |||
|  | 		} | |||
|  | 
 | |||
|  | 		private void WriteCommaIfRequired() | |||
|  | 		{ | |||
|  |             if (!isFirstProperty) | |||
|  |                 baseWriter.Write(','); | |||
|  |             else | |||
|  |                 isFirstProperty = false; | |||
|  |             WriteNewlineAndTabs(); | |||
|  |         } | |||
|  | 
 | |||
|  | 		internal override void WriteRawProperty(string name, byte[] value) | |||
|  | 		{  | |||
|  | 			StartWriteProperty(name); baseWriter.Write(settings.encoding.GetString(value, 0, value.Length)); EndWriteProperty(name); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void StartWriteFile() | |||
|  | 		{ | |||
|  |             if (writeHeaderAndFooter) | |||
|  |                 baseWriter.Write('{'); | |||
|  |             base.StartWriteFile(); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void EndWriteFile() | |||
|  | 		{ | |||
|  |             base.EndWriteFile(); | |||
|  |             WriteNewlineAndTabs(); | |||
|  | 			if(writeHeaderAndFooter) | |||
|  | 				baseWriter.Write('}'); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void StartWriteProperty(string name) | |||
|  | 		{ | |||
|  |             base.StartWriteProperty(name); | |||
|  | 			WriteCommaIfRequired(); | |||
|  | 			Write(name); | |||
|  | 
 | |||
|  |             if(settings.prettyPrint) | |||
|  |                 baseWriter.Write(' '); | |||
|  |             baseWriter.Write(':'); | |||
|  |             if (settings.prettyPrint) | |||
|  |                 baseWriter.Write(' '); | |||
|  |         } | |||
|  | 
 | |||
|  | 		internal override void EndWriteProperty(string name) | |||
|  | 		{ | |||
|  |             // It's not necessary to perform any operations after writing the property in JSON. | |||
|  |             base.EndWriteProperty(name); | |||
|  |         } | |||
|  | 
 | |||
|  | 		internal override void StartWriteObject(string name) | |||
|  | 		{ | |||
|  |             base.StartWriteObject(name); | |||
|  |             isFirstProperty = true; | |||
|  | 			baseWriter.Write('{'); | |||
|  |         } | |||
|  | 
 | |||
|  | 		internal override void EndWriteObject(string name) | |||
|  | 		{ | |||
|  |             base.EndWriteObject(name); | |||
|  |             // Set isFirstProperty to false incase we didn't write any properties, in which case | |||
|  |             // WriteCommaIfRequired() is never called. | |||
|  |             isFirstProperty = false; | |||
|  |             WriteNewlineAndTabs(); | |||
|  |             baseWriter.Write('}'); | |||
|  |         } | |||
|  | 
 | |||
|  | 		internal override void StartWriteCollection() | |||
|  | 		{ | |||
|  |             base.StartWriteCollection(); | |||
|  |             baseWriter.Write('['); | |||
|  |             WriteNewlineAndTabs(); | |||
|  |         } | |||
|  | 
 | |||
|  | 		internal override void EndWriteCollection() | |||
|  | 		{ | |||
|  |             base.EndWriteCollection(); | |||
|  |             WriteNewlineAndTabs(); | |||
|  |             baseWriter.Write(']'); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void StartWriteCollectionItem(int index) | |||
|  | 		{ | |||
|  | 			if(index != 0) | |||
|  | 				baseWriter.Write(','); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void EndWriteCollectionItem(int index) | |||
|  | 		{ | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void StartWriteDictionary() | |||
|  | 		{ | |||
|  | 			StartWriteObject(null); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void EndWriteDictionary() | |||
|  | 		{ | |||
|  | 			EndWriteObject(null); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void StartWriteDictionaryKey(int index) | |||
|  | 		{ | |||
|  | 			if(index != 0) | |||
|  | 				baseWriter.Write(','); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void EndWriteDictionaryKey(int index) | |||
|  | 		{ | |||
|  | 			baseWriter.Write(':'); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void StartWriteDictionaryValue(int index) | |||
|  | 		{ | |||
|  | 		} | |||
|  | 
 | |||
|  | 		internal override void EndWriteDictionaryValue(int index) | |||
|  | 		{ | |||
|  | 		} | |||
|  | 
 | |||
|  | 		#endregion | |||
|  | 
 | |||
|  | 		public override void Dispose() | |||
|  | 		{ | |||
|  | 			baseWriter.Dispose(); | |||
|  | 		} | |||
|  | 
 | |||
|  |         public void WriteNewlineAndTabs() | |||
|  |         { | |||
|  |             if (settings.prettyPrint) | |||
|  |             { | |||
|  |                 baseWriter.Write(Environment.NewLine); | |||
|  |                 for (int i = 0; i < serializationDepth; i++) | |||
|  |                     baseWriter.Write('\t'); | |||
|  |             } | |||
|  |         } | |||
|  | 	} | |||
|  | } |