У меня есть класс, который является оболочкой над строкой, обеспечивающей некоторые дополнительные функции. Среди других интерфейсов он также реализует интерфейс IEnumerable<char>
.
Я хотел бы иметь возможность сериализовать его в строку с помощью JsonNet. Поскольку это не работало и всегда сериализовалось в массив - я думаю, из-за интерфейса IEnumerable<char>
я добавил интерфейс ISerializable
. Но по какой-то причине JsonNet по-прежнему создает массив и игнорирует ISerializable
. Добавление SerializableAttribute
тоже не помогло.
Вот небольшое доказательство концептуального кода, демонстрирующего поведение (для LINQPad):
void Main()
{
JsonConvert.SerializeObject(new NotACollection("foo")).Dump(); // ["f","o","o"]
}
[Serializable]
class NotACollection : IEnumerable<char>, ISerializable
{
private readonly string _value;
public NotACollection(string value)
{
_value = value;
}
public IEnumerator<char> GetEnumerator()
{
return _value.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("_value", _value);
}
public override string ToString()
{
return _value;
}
}
Я знаю, что могу создать собственный класс JsonCovert
, но поскольку оболочка находится в библиотеке, где я не хочу ссылаться на JsonNet, я бы предпочел другое решение.
Я делаю что-то не так здесь? Я думал, что JsonNet выберет реализацию ISerializable
, если она доступна?
(этот класс не должен реализовывать неявное преобразование в строку, потому что это противоречит его цели и приводит к странным ошибкам)