234 lines
6.2 KiB
C#
234 lines
6.2 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');
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|