Consoletest/Program.cs | 31 ++--
Consoletest/consoletest.csproj | 1 -
Consoletest/dataobjects.cs | 4 +
fastJSON/JSON.cs | 338 ++++++++++++++++++++++++++---------------
fastJSON/JsonParser.cs | 11 +-
fastJSON/JsonSerializer.cs | 28 ++--
fastJSON/fastJSON.csproj | 4 +-
7 files changed, 261 insertions(+), 156 deletions(-)
diff --git a/Consoletest/Program.cs b/Consoletest/Program.cs
index 1911e21..68a8b5e 100644
--- a/Consoletest/Program.cs
+++ b/Consoletest/Program.cs
@@ -2,6 +2,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Data;
+using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
@@ -171,19 +172,21 @@ namespace consoletest
Console.WriteLine();
Console.Write("fastjson deserialize");
colclass c = CreateObject();
+ var stopwatch = new Stopwatch();
for (int pp = 0; pp < tcount; pp++)
{
- DateTime st = DateTime.Now;
colclass deserializedStore;
string jsonText = null;
+ stopwatch.Restart();
jsonText = fastJSON.JSON.Instance.ToJSON(c);
//Console.WriteLine(" size = " + jsonText.Length);
for (int i = 0; i < count; i++)
{
deserializedStore = (colclass)fastJSON.JSON.Instance.ToObject(jsonText);
}
- Console.Write("\t" + DateTime.Now.Subtract(st).TotalMilliseconds);
+ stopwatch.Stop();
+ Console.Write("\t" + stopwatch.ElapsedMilliseconds);
}
}
@@ -192,15 +195,17 @@ namespace consoletest
Console.WriteLine();
Console.Write("fastjson serialize");
colclass c = CreateObject();
+ var stopwatch = new Stopwatch();
for (int pp = 0; pp < tcount; pp++)
{
- DateTime st = DateTime.Now;
string jsonText = null;
+ stopwatch.Restart();
for (int i = 0; i < count; i++)
{
jsonText = fastJSON.JSON.Instance.ToJSON(c);
}
- Console.Write("\t" + DateTime.Now.Subtract(st).TotalMilliseconds);
+ stopwatch.Stop();
+ Console.Write("\t" + stopwatch.ElapsedMilliseconds);
}
}
@@ -209,20 +214,24 @@ namespace consoletest
Console.WriteLine();
Console.Write("bin deserialize");
colclass c = CreateObject();
+ var stopwatch = new Stopwatch();
for (int pp = 0; pp < tcount; pp++)
{
- DateTime st = DateTime.Now;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
+ colclass deserializedStore = null;
+ stopwatch.Restart();
bf.Serialize(ms, c);
- colclass deserializedStore = null;
//Console.WriteLine(" size = " +ms.Length);
for (int i = 0; i < count; i++)
{
+ stopwatch.Stop(); // we stop then resume the stopwatch here so we don't factor in Seek()'s execution
ms.Seek(0L, SeekOrigin.Begin);
+ stopwatch.Start();
deserializedStore = (colclass)bf.Deserialize(ms);
}
- Console.Write("\t" + DateTime.Now.Subtract(st).TotalMilliseconds);
+ stopwatch.Stop();
+ Console.Write("\t" + stopwatch.ElapsedMilliseconds);
}
}
@@ -230,17 +239,21 @@ namespace consoletest
{
Console.Write("\r\nbin serialize");
colclass c = CreateObject();
+ var stopwatch = new Stopwatch();
for (int pp = 0; pp < tcount; pp++)
{
- DateTime st = DateTime.Now;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
+ stopwatch.Restart();
for (int i = 0; i < count; i++)
{
+ stopwatch.Stop(); // we stop then resume the stop watch here so we don't factor in the MemoryStream()'s execution
ms = new MemoryStream();
+ stopwatch.Start();
bf.Serialize(ms, c);
}
- Console.Write("\t" + DateTime.Now.Subtract(st).TotalMilliseconds);
+ stopwatch.Stop();
+ Console.Write("\t" + stopwatch.ElapsedMilliseconds);
}
}
diff --git a/Consoletest/consoletest.csproj b/Consoletest/consoletest.csproj
index 1af547c..9652f6f 100644
--- a/Consoletest/consoletest.csproj
+++ b/Consoletest/consoletest.csproj
@@ -59,7 +59,6 @@
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
- <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
diff --git a/Consoletest/dataobjects.cs b/Consoletest/dataobjects.cs
index 8a77c3a..2631a4c 100644
--- a/Consoletest/dataobjects.cs
+++ b/Consoletest/dataobjects.cs
@@ -8,12 +8,14 @@ namespace consoletest
#region [ data objects ]
+ [Serializable]
public class baseclass
{
public string Name { get; set; }
public string Code { get; set; }
}
+ [Serializable]
public class class1 : baseclass
{
public class1() { }
@@ -26,6 +28,7 @@ namespace consoletest
public Guid guid { get; set; }
}
+ [Serializable]
public class class2 : baseclass
{
public class2() { }
@@ -44,6 +47,7 @@ namespace consoletest
Female
}
+ [Serializable]
public class colclass
{
public colclass()
diff --git a/fastJSON/JSON.cs b/fastJSON/JSON.cs
index 452a822..81b1260 100644
--- a/fastJSON/JSON.cs
+++ b/fastJSON/JSON.cs
@@ -68,6 +68,7 @@ namespace fastJSON
public sealed class JSON
{
+ //static JSON() { Console.WriteLine("myPropInfo: {0}", System.Runtime.InteropServices.Marshal.SizeOf(typeof(myPropInfo)).ToString("X8")); }
//public readonly static JSON Instance = new JSON();
[ThreadStatic]
private static JSON _instance;
@@ -229,39 +230,55 @@ namespace fastJSON
#region [ JSON specific reflection ]
+ private enum myPropInfoType
+ {
+ Int,
+ Long,
+ String,
+ Bool,
+ DateTime,
+ Enum,
+ Guid,
+
+ Array,
+ ByteArray,
+ Dictionary,
+ StringDictionary,
+#if !SILVERLIGHT
+ Hashtable,
+ DataSet,
+ DataTable,
+#endif
+#if CUSTOMTYPE
+ Custom,
+#endif
+
+ Unknown,
+ };
+ [Flags]
+ private enum myPropInfoFlags
+ {
+ Filled = 1<<0,
+ CanWrite = 1<<1,
+ Class = 1<<2,
+ ValueType = 1<<3,
+ GenericType = 1<<4,
+ };
private struct myPropInfo
{
- public bool filled;
public Type pt;
public Type bt;
public Type changeType;
- public bool isDictionary;
- public bool isValueType;
- public bool isGenericType;
- public bool isArray;
- public bool isByteArray;
- public bool isGuid;
-#if !SILVERLIGHT
- public bool isDataSet;
- public bool isDataTable;
- public bool isHashtable;
-#endif
- public Reflection.GenericSetter setter;
- public bool isEnum;
- public bool isDateTime;
- public Type[] GenericTypes;
- public bool isInt;
- public bool isLong;
- public bool isString;
- public bool isBool;
- public bool isClass;
- public Reflection.GenericGetter getter;
- public bool isStringDictionary;
- public string Name;
-#if CUSTOMTYPE
- public bool isCustomType;
-#endif
- public bool CanWrite;
+ public Reflection.GenericSetter setter;
+ public Reflection.GenericGetter getter;
+ public Type[] GenericTypes;
+ public string Name;
+ public myPropInfoType Type;
+ public myPropInfoFlags Flags;
+
+ public bool IsClass { get { return (Flags & myPropInfoFlags.Class) != 0; } }
+ public bool IsValueType { get { return (Flags & myPropInfoFlags.ValueType) != 0; } }
+ public bool IsGenericType { get { return (Flags & myPropInfoFlags.GenericType) != 0; } }
}
SafeDictionary<string, SafeDictionary<string, myPropInfo>> _propertycache = new SafeDictionary<string, SafeDictionary<string, myPropInfo>>();
@@ -279,7 +296,7 @@ namespace fastJSON
foreach (PropertyInfo p in pr)
{
myPropInfo d = CreateMyProp(p.PropertyType, p.Name);
- d.CanWrite = p.CanWrite;
+ d.Flags |= myPropInfoFlags.CanWrite;
d.setter = Reflection.CreateSetMethod(type, p);
d.getter = Reflection.CreateGetMethod(type, p);
sd.Add(p.Name, d);
@@ -301,44 +318,55 @@ namespace fastJSON
private myPropInfo CreateMyProp(Type t, string name)
{
myPropInfo d = new myPropInfo();
- d.filled = true;
- d.CanWrite = true;
- d.pt = t;
- d.Name = name;
- d.isDictionary = t.Name.Contains("Dictionary");
- if (d.isDictionary)
- d.GenericTypes = t.GetGenericArguments();
- d.isValueType = t.IsValueType;
- d.isGenericType = t.IsGenericType;
- d.isArray = t.IsArray;
- if (d.isArray)
- d.bt = t.GetElementType();
- if (d.isGenericType)
- d.bt = t.GetGenericArguments()[0];
- d.isByteArray = t == typeof(byte[]);
- d.isGuid = (t == typeof(Guid) || t == typeof(Guid?));
+ myPropInfoType d_type = myPropInfoType.Unknown;
+ myPropInfoFlags d_flags = myPropInfoFlags.Filled | myPropInfoFlags.CanWrite;
+
+ if (t == typeof(int) || t == typeof(int?)) d_type = myPropInfoType.Int;
+ else if (t == typeof(long) || t == typeof(long?)) d_type = myPropInfoType.Long;
+ else if (t == typeof(string)) d_type = myPropInfoType.String;
+ else if (t == typeof(bool) || t == typeof(bool?)) d_type = myPropInfoType.Bool;
+ else if (t == typeof(DateTime) || t == typeof(DateTime?)) d_type = myPropInfoType.DateTime;
+ else if (t.IsEnum) d_type = myPropInfoType.Enum;
+ else if (t == typeof(Guid) || t == typeof(Guid?)) d_type = myPropInfoType.Guid;
+ else if (t.IsArray)
+ {
+ d.bt = t.GetElementType();
+ if (t == typeof(byte[]))
+ d_type = myPropInfoType.ByteArray;
+ else
+ d_type = myPropInfoType.Array;
+ }
+ else if (t.Name.Contains("Dictionary"))
+ {
+ d.GenericTypes = t.GetGenericArguments();
+ if(d.GenericTypes.Length > 0 && d.GenericTypes[0] == typeof(string))
+ d_type = myPropInfoType.StringDictionary;
+ else
+ d_type = myPropInfoType.Dictionary;
+ }
#if !SILVERLIGHT
- d.isHashtable = t == typeof(Hashtable);
- d.isDataSet = t == typeof(DataSet);
- d.isDataTable = t == typeof(DataTable);
+ else if (t == typeof(Hashtable)) d_type = myPropInfoType.Hashtable;
+ else if (t == typeof(DataSet)) d_type = myPropInfoType.DataSet;
+ else if (t == typeof(DataTable)) d_type = myPropInfoType.DataTable;
+#endif
+#if CUSTOMTYPE
+ else if (IsTypeRegistered(t)) d_type = myPropInfoType.Custom;
#endif
- d.changeType = GetChangeType(t);
- d.isEnum = t.IsEnum;
- d.isDateTime = t == typeof(DateTime) || t == typeof(DateTime?);
- d.isInt = t == typeof(int) || t == typeof(int?);
- d.isLong = t == typeof(long) || t == typeof(long?);
- d.isString = t == typeof(string);
- d.isBool = t == typeof(bool) || t == typeof(bool?);
- d.isClass = t.IsClass;
+ if (t.IsClass) d_flags |= myPropInfoFlags.Class;
+ if (t.IsValueType) d_flags |= myPropInfoFlags.ValueType;
+ if (t.IsGenericType)
+ {
+ d_flags |= myPropInfoFlags.GenericType;
+ d.bt = t.GetGenericArguments()[0];
+ }
- if (d.isDictionary && d.GenericTypes.Length > 0 && d.GenericTypes[0] == typeof(string))
- d.isStringDictionary = true;
+ d.pt = t;
+ d.Name = name;
+ d.changeType = GetChangeType(t);
+ d.Type = d_type;
+ d.Flags = d_flags;
-#if CUSTOMTYPE
- if (IsTypeRegistered(t))
- d.isCustomType = true;
-#endif
return d;
}
@@ -469,74 +497,59 @@ namespace fastJSON
myPropInfo pi;
if (props.TryGetValue(name, out pi) == false)
continue;
- if (pi.filled && pi.CanWrite)
+ if ((pi.Flags & (myPropInfoFlags.Filled|myPropInfoFlags.CanWrite)) != 0)
{
object v = d[name];
if (v != null)
{
- object oset = null;
-
- if (pi.isInt)
- oset = (int)((long)v);
-#if CUSTOMTYPE
- else if (pi.isCustomType)
- oset = CreateCustom((string)v, pi.pt);
-#endif
- else if (pi.isLong)
- oset = (long)v;
-
- else if (pi.isString)
- oset = (string)v;
-
- else if (pi.isBool)
- oset = (bool)v;
-
- else if (pi.isGenericType && pi.isValueType == false && pi.isDictionary == false && v is List<object>)
- oset = CreateGenericList((List<object>)v, pi.pt, pi.bt, globaltypes);
-
- else if (pi.isByteArray)
- oset = Convert.FromBase64String((string)v);
-
- else if (pi.isArray && pi.isValueType == false)
- oset = CreateArray((List<object>)v, pi.pt, pi.bt, globaltypes);
-
- else if (pi.isGuid)
- oset = CreateGuid((string)v);
+ object oset = null;
+
+ switch (pi.Type)
+ {
+ case myPropInfoType.Int: oset = (int)((long)v); break;
+ case myPropInfoType.Long: oset = (long)v; break;
+ case myPropInfoType.String: oset = (string)v; break;
+ case myPropInfoType.Bool: oset = (bool)v; break;
+ case myPropInfoType.DateTime: oset = CreateDateTime((string)v); break;
+ case myPropInfoType.Enum: oset = CreateEnum(pi.pt, (string)v); break;
+ case myPropInfoType.Guid: oset = CreateGuid((string)v); break;
+
+ case myPropInfoType.Array:
+ if(!pi.IsValueType)
+ oset = CreateArray((List<object>)v, pi.pt, pi.bt, globaltypes);
+ // what about 'else'?
+ break;
+ case myPropInfoType.ByteArray: oset = Convert.FromBase64String((string)v); break;
#if !SILVERLIGHT
- else if (pi.isDataSet)
- oset = CreateDataset((Dictionary<string, object>)v, globaltypes);
-
- else if (pi.isDataTable)
- oset = this.CreateDataTable((Dictionary<string, object>)v, globaltypes);
+ case myPropInfoType.DataSet: oset = CreateDataset((Dictionary<string, object>)v, globaltypes); break;
+ case myPropInfoType.DataTable: oset = this.CreateDataTable((Dictionary<string, object>)v, globaltypes); break;
+ case myPropInfoType.Hashtable: // same case as Dictionary
#endif
-
- else if (pi.isStringDictionary)
- oset = CreateStringKeyDictionary((Dictionary<string, object>)v, pi.pt, pi.GenericTypes, globaltypes);
-#if !SILVERLIGHT
- else if (pi.isDictionary || pi.isHashtable)
-#else
- else if (pi.isDictionary)
+ case myPropInfoType.Dictionary: oset = CreateDictionary((List<object>)v, pi.pt, pi.GenericTypes, globaltypes); break;
+ case myPropInfoType.StringDictionary: oset = CreateStringKeyDictionary((Dictionary<string, object>)v, pi.pt, pi.GenericTypes, globaltypes); break;
+#if CUSTOMTYPE
+ case myPropInfoType.Custom: oset = CreateCustom((string)v, pi.pt); break;
#endif
- oset = CreateDictionary((List<object>)v, pi.pt, pi.GenericTypes, globaltypes);
-
- else if (pi.isEnum)
- oset = CreateEnum(pi.pt, (string)v);
-
- else if (pi.isDateTime)
- oset = CreateDateTime((string)v);
+ default:
+ {
+ if (pi.IsGenericType && pi.IsValueType == false && v is List<object>)
+ oset = CreateGenericList((List<object>)v, pi.pt, pi.bt, globaltypes);
- else if (pi.isClass && v is Dictionary<string, object>)
- oset = ParseDictionary((Dictionary<string, object>)v, globaltypes, pi.pt, pi.getter(o));
+ else if (pi.IsClass && v is Dictionary<string, object>)
+ oset = ParseDictionary((Dictionary<string, object>)v, globaltypes, pi.pt, pi.getter(o));
- else if (pi.isValueType)
- oset = ChangeType(v, pi.changeType);
+ else if (v is List<object>)
+ oset = CreateArray((List<object>)v, pi.pt, typeof(object), globaltypes);
- else if (v is List<object>)
- oset = CreateArray((List<object>)v, pi.pt, typeof(object), globaltypes);
+ else if (pi.IsValueType)
+ oset = ChangeType(v, pi.changeType);
- else
- oset = v;
+ else
+ oset = v;
+ }
+ break;
+ }
o = pi.setter(o, oset);
}
@@ -566,6 +579,72 @@ namespace fastJSON
}
}
+ static int CreateInteger(out int num, string s, int index, int count)
+ {
+ num = 0;
+ bool neg = false;
+ for (int x = 0; x < count; x++, index++)
+ {
+ char cc = s[index];
+
+ if (cc == '-')
+ neg = true;
+ else if (cc == '+')
+ neg = false;
+ else
+ {
+ num *= 10;
+ num += (int)(cc - '0');
+ }
+ }
+ if(neg) num = -num;
+
+ return num;
+ }
+ static long CreateInteger(out long num, string s, int index, int count)
+ {
+ num = 0;
+ bool neg = false;
+ for (int x = 0; x < count; x++, index++)
+ {
+ char cc = s[index];
+
+ if (cc == '-')
+ neg = true;
+ else if (cc == '+')
+ neg = false;
+ else
+ {
+ num *= 10;
+ num += (int)(cc - '0');
+ }
+ }
+ if (neg) num = -num;
+
+ return num;
+ }
+ internal static long CreateInteger(out long num, char[] s, int index, int count)
+ {
+ num = 0;
+ bool neg = false;
+ for (int x = 0; x < count; x++, index++)
+ {
+ char cc = s[index];
+
+ if (cc == '-')
+ neg = true;
+ else if (cc == '+')
+ neg = false;
+ else
+ {
+ num *= 10;
+ num += (int)(cc - '0');
+ }
+ }
+ if (neg) num = -num;
+
+ return num;
+ }
private long CreateLong(string s)
{
long num = 0;
@@ -609,14 +688,21 @@ namespace fastJSON
bool utc = false;
// 0123456789012345678
// datetime format = yyyy-MM-dd HH:mm:ss
- int year = (int)CreateLong(value.Substring(0, 4));
- int month = (int)CreateLong(value.Substring(5, 2));
- int day = (int)CreateLong(value.Substring(8, 2));
- int hour = (int)CreateLong(value.Substring(11, 2));
- int min = (int)CreateLong(value.Substring(14, 2));
- int sec = (int)CreateLong(value.Substring(17, 2));
-
- if (value.EndsWith("Z"))
+ int year;// = (int)CreateLong(value.Substring(0, 4));
+ int month;// = (int)CreateLong(value.Substring(5, 2));
+ int day;// = (int)CreateLong(value.Substring(8, 2));
+ int hour;// = (int)CreateLong(value.Substring(11, 2));
+ int min;// = (int)CreateLong(value.Substring(14, 2));
+ int sec;// = (int)CreateLong(value.Substring(17, 2));
+ CreateInteger(out year, value, 0, 4);
+ CreateInteger(out month, value, 5, 2);
+ CreateInteger(out day, value, 8, 2);
+ CreateInteger(out hour, value, 11, 2);
+ CreateInteger(out min, value, 14, 2);
+ CreateInteger(out sec, value, 17, 2);
+
+ //if (value.EndsWith("Z"))
+ if (value[value.Length-1] == 'Z')
utc = true;
if (_params.UseUTCDateTime == false && utc == false)
diff --git a/fastJSON/JsonParser.cs b/fastJSON/JsonParser.cs
index 3c2abdd..929ab73 100644
--- a/fastJSON/JsonParser.cs
+++ b/fastJSON/JsonParser.cs
@@ -305,10 +305,13 @@ namespace fastJSON
break;
} while (true);
- string s = new string(json, startIndex, index - startIndex);
- if (dec)
- return double.Parse(s,NumberFormatInfo.InvariantInfo);
- return CreateLong(s);
+ if (dec)
+ {
+ string s = new string(json, startIndex, index - startIndex);
+ return double.Parse(s, NumberFormatInfo.InvariantInfo);
+ }
+ long num;
+ return JSON.CreateInteger(out num, json, startIndex, index - startIndex);
}
private Token LookAhead()
diff --git a/fastJSON/JsonSerializer.cs b/fastJSON/JsonSerializer.cs
index 50c8c9d..a3611c5 100644
--- a/fastJSON/JsonSerializer.cs
+++ b/fastJSON/JsonSerializer.cs
@@ -40,11 +40,11 @@ namespace fastJSON
{
if (pendingSeparator) sb.Append(',');
pendingSeparator = true;
- sb.Append("\"");
+ sb.Append('\"');
sb.Append(kv.Key);
sb.Append("\":\"");
sb.Append(kv.Value);
- sb.Append("\"");
+ sb.Append('\"');
}
sb.Append("},");
sb.Append(_output.ToString());
@@ -150,23 +150,23 @@ namespace fastJSON
if (_params.UseUTCDateTime)
dt = dateTime.ToUniversalTime();
- _output.Append("\"");
+ _output.Append('\"');
_output.Append(dt.Year.ToString("0000", NumberFormatInfo.InvariantInfo));
- _output.Append("-");
+ _output.Append('-');
_output.Append(dt.Month.ToString("00", NumberFormatInfo.InvariantInfo));
- _output.Append("-");
+ _output.Append('-');
_output.Append(dt.Day.ToString("00", NumberFormatInfo.InvariantInfo));
- _output.Append(" ");
+ _output.Append(' ');
_output.Append(dt.Hour.ToString("00", NumberFormatInfo.InvariantInfo));
- _output.Append(":");
+ _output.Append(':');
_output.Append(dt.Minute.ToString("00", NumberFormatInfo.InvariantInfo));
- _output.Append(":");
+ _output.Append(':');
_output.Append(dt.Second.ToString("00", NumberFormatInfo.InvariantInfo));
if (_params.UseUTCDateTime)
- _output.Append("Z");
+ _output.Append('Z');
- _output.Append("\"");
+ _output.Append('\"');
}
#if !SILVERLIGHT
@@ -231,7 +231,7 @@ namespace fastJSON
bool tablesep = false;
foreach (DataTable table in ds.Tables)
{
- if (tablesep) _output.Append(",");
+ if (tablesep) _output.Append(',');
tablesep = true;
WriteDataTableData(table);
}
@@ -248,7 +248,7 @@ namespace fastJSON
bool rowseparator = false;
foreach (DataRow row in table.Rows)
{
- if (rowseparator) _output.Append(",");
+ if (rowseparator) _output.Append(',');
rowseparator = true;
_output.Append('[');
@@ -290,12 +290,12 @@ namespace fastJSON
{
if (_TypesWritten == false)
{
- _output.Append("{");
+ _output.Append('{');
_before = _output;
_output = new StringBuilder();
}
else
- _output.Append("{");
+ _output.Append('{');
}
_TypesWritten = true;
_current_depth++;
diff --git a/fastJSON/fastJSON.csproj b/fastJSON/fastJSON.csproj
index 9eabd29..ba0c013 100644
--- a/fastJSON/fastJSON.csproj
+++ b/fastJSON/fastJSON.csproj
@@ -48,7 +48,7 @@
<OutputPath>bin\Debug\</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
- <DefineConstants>-CUSTOMTYPE </DefineConstants>
+ <DefineConstants>CUSTOMTYPE </DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>full</DebugType>
@@ -74,7 +74,7 @@
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
- <Reference Include="System.Xml" />
+ <Reference Include="System.XML" />
</ItemGroup>
<ItemGroup>
<Compile Include="AssemblyInfo.cs" />