using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.ComponentModel;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using Microsoft.Xna.Framework;
public static void Test()
var bytes = new byte[] { 0xF9, 0xFF, 0x4F, 0xC1 };
Console.WriteLine("\nSerializing without JsonConverter: ");
Console.WriteLine("Round trip failed with error: " + ex.Message);
Console.WriteLine("\nSerializing WITH JsonConverter: ");
Test(bytes, new JsonSerializerSettings { Converters = { new Vector2Converter() } });
public static void Test(byte[] bytes, JsonSerializerSettings settings)
Console.WriteLine("Input bytes: {0}.", string.Join(",", bytes.Select(b => "0x" + b.ToString("X"))));
float myFloat = BitConverter.ToSingle(bytes, 0);
Console.WriteLine("Input float: {0}.", myFloat.ToString("r"));
var vector = new Vector2(myFloat, myFloat);
var json = JsonConvert.SerializeObject(vector, settings);
Console.WriteLine("Output JSON:");
var vector2 = JsonConvert.DeserializeObject<Vector2>(json, settings);
Assert.IsTrue(myFloat == vector2.X, "myFloat == vector2.X failed!");
Assert.IsTrue(bytes.SequenceEqual(BitConverter.GetBytes(vector2.X)), "bytes.SequenceEqual(BitConverter.GetBytes(vector2.X)) failed!");
public class Vector2Converter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(Vector2) || objectType == typeof(Vector2?);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
var dto = serializer.Deserialize<Vector2DTO>(reader);
return new Vector2(dto.X, dto.Y);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
var vec = (Vector2)value;
serializer.Serialize(writer, new Vector2DTO { X = vec.X, Y = vec.Y });
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
public static void IsTrue(bool value, string message)
throw new AssertionFailedException(message ?? "failed");
namespace Microsoft.Xna.Framework
[TypeConverter(typeof(Vector2Converter))]
public struct Vector2 : IEquatable<Vector2>
#region Public Static Properties
public static Vector2 Zero
public static Vector2 One
public static Vector2 UnitX
public static Vector2 UnitY
#region Internal Properties
internal string DebugDisplayString
#region Private Static Fields
private static readonly Vector2 zeroVector = new Vector2(0f, 0f);
private static readonly Vector2 unitVector = new Vector2(1f, 1f);
private static readonly Vector2 unitXVector = new Vector2(1f, 0f);
private static readonly Vector2 unitYVector = new Vector2(0f, 1f);
#region Public Constructors
public Vector2(float x, float y)
public Vector2(float value)
public override bool Equals(object obj)
return (obj is Vector2) && Equals((Vector2) obj);
public bool Equals(Vector2 other)
public override int GetHashCode()
return X.GetHashCode() + Y.GetHashCode();
return (float) Math.Sqrt((X * X) + (Y * Y));
public float LengthSquared()
return (X * X) + (Y * Y);
float val = 1.0f / (float) Math.Sqrt((X * X) + (Y * Y));
public override string ToString()
#region Public Static Methods
#region Public Static Operators
public static Vector2 operator -(Vector2 value)
public static bool operator ==(Vector2 value1, Vector2 value2)
return ( value1.X == value2.X &&
public static bool operator !=(Vector2 value1, Vector2 value2)
return !(value1 == value2);
public static Vector2 operator +(Vector2 value1, Vector2 value2)
public static Vector2 operator -(Vector2 value1, Vector2 value2)
public static Vector2 operator *(Vector2 value1, Vector2 value2)
public static Vector2 operator *(Vector2 value, float scaleFactor)
public static Vector2 operator *(float scaleFactor, Vector2 value)
public static Vector2 operator /(Vector2 value1, Vector2 value2)
public static Vector2 operator /(Vector2 value1, float divider)
float factor = 1 / divider;
public class Vector2Converter : MathTypeConverter
#region Public Constructor
public Vector2Converter() : base()
public override object ConvertFrom(
ITypeDescriptorContext context,
string s = value as string;
culture.TextInfo.ListSeparator.ToCharArray()
float.Parse(v[0], culture),
float.Parse(v[1], culture)
return base.ConvertFrom(context, culture, value);
public override object ConvertTo(
ITypeDescriptorContext context,
if (destinationType == typeof(string))
Vector2 vec = (Vector2) value;
culture.TextInfo.ListSeparator,
return base.ConvertTo(context, culture, value, destinationType);
public override object CreateInstance(
ITypeDescriptorContext context,
IDictionary propertyValues
return (object) new Vector2(
(float) propertyValues["X"],
(float) propertyValues["Y"]
public class MathTypeConverter : ExpandableObjectConverter
#region Protected Variables
protected PropertyDescriptorCollection propertyDescriptions;
protected bool supportStringConvert;
#region Public Constructor
public MathTypeConverter()
supportStringConvert = true;
public override bool CanConvertFrom(
ITypeDescriptorContext context,
if (supportStringConvert && sourceType == typeof(string))
return base.CanConvertFrom(context, sourceType);
public override bool CanConvertTo(
ITypeDescriptorContext context,
if (supportStringConvert && destinationType == typeof(string))
return base.CanConvertTo(context, destinationType);
public override bool GetCreateInstanceSupported(
ITypeDescriptorContext context
public override PropertyDescriptorCollection GetProperties(
ITypeDescriptorContext context,
return propertyDescriptions;
public override bool GetPropertiesSupported(
ITypeDescriptorContext context