Skip to content

Instantly share code, notes, and snippets.

@afifmohammed
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save afifmohammed/9204841 to your computer and use it in GitHub Desktop.
Save afifmohammed/9204841 to your computer and use it in GitHub Desktop.
Test that proves using a Stack<T> as a property on a document does not work with RavenDB
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Raven.Imports.Newtonsoft.Json;
using Raven.Tests.Helpers;
using Xunit;
namespace RavenTest
{
public class StackPropertyTypeSerializationTest : RavenTestBase
{
[Fact]
public void CanSaveAndLoadDocument()
{
using (var d = NewDocumentStore())
{
d.Conventions.CustomizeJsonSerializer += serializer => serializer.Converters.Add(new StackConverter());
string id;
using (var s = d.OpenSession())
{
var shelf = new Shelf();
shelf.Items.Push("a");
shelf.Items.Push("b");
s.Store(shelf);
s.SaveChanges();
id = shelf.Id;
}
using (var s = d.OpenSession())
{
Shelf shelf = null;
Assert.DoesNotThrow(() => shelf = s.Load<Shelf>(id));
Assert.NotNull(shelf);
}
}
}
}
public class Shelf
{
public Shelf()
{
Items = new Stack<string>();
}
public string Id { get; set; }
public Stack<string> Items { get; set; }
}
public class StackConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartArray();
foreach (var item in (ICollection)value)
{
serializer.Serialize(writer, item);
}
writer.WriteEndArray();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
dynamic instance = Activator.CreateInstance(objectType);
var genericArgument = objectType.GetGenericArguments()[0].MakeArrayType();
var arr = serializer.Deserialize(reader, genericArgument);
foreach (var item in (IEnumerable)arr)
{
instance.Push(item);
}
return instance;
}
public override bool CanConvert(Type objectType)
{
return objectType.IsGenericType &&
objectType.GetGenericTypeDefinition() == typeof (Stack<>);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment