gpt4 book ai didi

c# - 如果我已经创建了一个隐式类型转换运算符,我可以让 Raven DB 像序列化一个字符串那样序列化一个对象吗?

转载 作者:太空狗 更新时间:2023-10-29 20:51:46 24 4
gpt4 key购买 nike

我有一个看起来像这样的类:

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;
}
}

因此,我可以像这样使用这个类:

MyClass a = "Hello!";

但在 Raven DB 中,它将像这样存储

"SomeProperty": {}

因为它没有公共(public)属性。而且它毫无用处。

为了解决这个问题,我会将 _value 私有(private)成员改为公共(public)属性,如下所示:

public string Value { get; set; }

Raven DB 将存储

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

并且它将是可反序列化的。

但我不想要这个公共(public)属性(property)。我能以某种方式使 Raven DB 序列化和反序列化该类,就像它是一个字符串一样吗?喜欢:

"SomeProperty": "Hello!"

最佳答案

您好,我知道这已经过时了,但我想我会在 Ayendes 的回复中添加一些内容,以帮助像我一样遇到同样问题并花了几个小时在论坛上寻找答案的人(其中有一些但没有任何您可以遵循的示例),不难弄清楚这一点,但通过一个示例,我可以在 10 分钟内解决这个问题,而不是花费几个小时。

我的问题是我们的应用程序中有自定义值类型结构,我将使用的示例是 EmailAddress。不幸的是,在 Ravendb 中,我们无法在不定义自定义序列化程序的情况下对这些类型运行查询。

我们的值类型看起来像这样:

[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);
}
}

我们想要保存和查询的文档类型看起来像这样

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

自定义序列化程序将我们的电子邮件存储为原始字符串,然后在检索时将其转换回其值类型,如下所示:

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);
}
}

最后,我将其连接起来并能够按如下方式查询所有内容:

    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
}
}
}

关于c# - 如果我已经创建了一个隐式类型转换运算符,我可以让 Raven DB 像序列化一个字符串那样序列化一个对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10642184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com