Can I make Raven DB serialize an object since it will be a string if I created an implicit type conversion operator?

I have a class that looks something like this:

public class MyClass { string _value; public static implicit operator MyClass (string value) { return new MyClass(value); } MyClass(string value) { // Do something... _value = value; } public override string ToString() { // Do something... return _value; } } 

Therefore, I can use the class as follows:

 MyClass a = "Hello!"; 

But in Raven DB it will just be saved as

 "SomeProperty": {} 

since it does not have public properties. And it is completely useless.

To solve this problem, I would make the public property _value a private member, for example:

 public string Value { get; set; } 

and Raven DB will save

 "SomeProperty": { "Value": "Hello!" } 

and he will be deserializable.

But I do not want this public property. Can I somehow make Raven DB serialize and deserialize the class, as it would in a string? How:

 "SomeProperty": "Hello!" 
+6
source share
2 answers

You can write JsonConverter and teach RavenDB how you want to store data. After you write the converter, register it in the repository. Console.CustomizeSerializer event.

+6
source

Hi, I know this is old, but I thought I would add some additions to Iyendes’s answer to help people who, like me, had the same problem and spent hours watching forums for an answer (there were several, but none of them was any example that you could follow), it is not difficult to understand, but with the example I could solve this in 10 minutes, and not spend several hours.

My problems were that we have custom structs type types in our application, an example I will use is EmailAddress. Unfortunately, in Ravendb we could not run queries against these types without defining a custom serializer.

Our Type value was as follows:

 [DataContract(Namespace = DataContractNamespaces.ValueTypes)] public struct EmailAddress : IEquatable<EmailAddress> { private const char At = '@'; public EmailAddress(string value) : this() { if (value == null) { throw new ArgumentNullException("value"); } this.Value = value; } public bool IsWellFormed { get { return Regex.IsMatch(this.Value, @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"); } } public string Domain { get { return this.Value.Split(At)[1]; } } [DataMember(Name = "Value")] private string Value { get; set; } public static bool operator ==(EmailAddress left, EmailAddress right) { return left.Equals(right); } public static bool operator !=(EmailAddress left, EmailAddress right) { return !left.Equals(right); } public override bool Equals(object obj) { if (obj == null) { return false; } return this.Equals(new EmailAddress(obj.ToString())); } public override int GetHashCode() { return this.Value.GetHashCode(); } public override string ToString() { return this.Value; } public bool Equals(EmailAddress other) { return other != null && this.Value.Equals(other.ToString(), StringComparison.OrdinalIgnoreCase); } } 

The type of document we wanted to save and the request would look something like this.

 public class Customer { public Guid Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public EmailAddress Email { get; set; } } 

A custom serializer to store our email as a raw string, and then convert it back to its value type when searching, looks like this:

 public class EmailConverterTest : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(EmailAddress); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { EmailAddress actualAddress = new EmailAddress(reader.Value.ToString()); return actualAddress; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { EmailAddress actualAddress = (EmailAddress)value; string stringEmail = actualAddress.ToString(); writer.WriteValue(stringEmail); } } 

Finally, I plugged it in and was able to query everything like this:

  public static void serializercustom(Newtonsoft.Json.JsonSerializer serialiser) { serialiser.Converters.Add(new EmailConverterTest()); } public static void TestCustomer() { using (var documentStore = new DefaultDocumentStore()) { documentStore.ConnectionStringName = Properties.Settings.Default.SandBoxConnection; documentStore.Initialize(); documentStore.Conventions.CustomizeJsonSerializer = new Action<Newtonsoft.Json.JsonSerializer>(serializercustom); var customer = new Customer { Id = Guid.NewGuid(), FirstName = "TestFirstName", LastName = "TestLastName", Email = new EmailAddress(" testemail@gmail.com ") }; // Save and retrieve the data using (var session = documentStore.OpenSession()) { session.Store(customer); session.SaveChanges(); } using (var session = documentStore.OpenSession()) { var addressToQuery = customer.Email; var result = session.Query<Customer>(typeof(CustomerEmailIndex).Name).Customize(p => p.WaitForNonStaleResults()).Where(p => p.Email == addressToQuery); Console.WriteLine("Number of Results {0}", result.Count()); // This always seems to return the matching document } } } 
+11
source

Source: https://habr.com/ru/post/916026/


All Articles