Сериализация типа C # не как коллекция пар ключ-значение - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть класс, который при сериализации я хочу вернуть как одну строку без пар ключ-значение.Строка становится строкой.Int становится int.Как мне сделать мой класс строкой?

Глядя на DataContract и Сериализуемый , это не выглядит возможным.Настройка SerializationInfo.AddValue (имя, значение) заставляет весь ваш объект использовать подход ключ-значение.Я просто хочу вернуть "A and B" .

[DataContract]
public class MyObject
{
    public int A { get; set; }
    public int B { get; set; }
}

При сериализации с использованием, например, DataContractJsonSerializer , я хочу, чтобы оно было:

4 and 2

Не

{
    "A": 4,
    "B": 2
}

Итак, допустим, у меня есть родительский класс, который использует оба этих пользовательских типа:

[DataContract]
public class Parent
{
    [DataMember]
    public MyObject One { get; set; }

    [DataMember]
    public MyObject Two { get; set; }
}

Я хочу, чтобы он сериализовался следующим образом:

{
    "One": "4 and 2",
    "Two": "6 and 8"
}

Вместо этого мне кажется, что я могу сделать только одно:

{
    "One": {
        "A": 4,
        "B": 2
    },
    "Two": {
        "A": 6,
        "B": 8
    }
}

Единственное решение, которое будет работать, - это добавить пользовательскую сериализацию в Parent, установивОдин и два соответственно, но я не хочу этого делать, я хочу, чтобы мой новый класс везде сериализовался как строка.

Могу ли я сериализовать тип как одно возвращаемое значение?Или все типы, кроме встроенных, таких как int и string, должны сериализоваться в объект?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Мой ответ: Вы не можете.

Родительский класс MyObject должен реализовать ISerializable для обеспечения настраиваемой сериализации самого класса.Это возлагает ответственность за правильную сериализацию класса так, как он предназначен для каждого класса, который желает его использовать, что является нежелательным опытом, и подчеркивает серьезный недостаток дизайна в поддерживаемой стратегии .NET нестандартного сериализатора.

[Serializable]
public class Parent : ISerializable
{
    public MyObject One { get; set; }

    public MyObject Two { get; set; }

    public (SerializerInfo info, SerializerContext context)
    {
        string oneString = info.GetString("One");
        One = new MyObject(oneString);

        string twoString = info.GetString("Two");
        Two = new MyObject(twoString);
    }

    public override void GetObjectData(SerializerInfo info, SerializerContext context)
    {
        info.AddValue("One", One.ToString());
        info.AddValue("Two", Two.ToString());
    }
}

Grumble grumble ... добавить это в длинный список вещей, которые .NET ошиблась.Статические / неинтерфейсные классы для всего, что делает фреймворк непроверенным по умолчанию без создания плагинов-плагинов для всегоКомпиляторы с потерями MSIL / символов.Я мог бы продолжать и продолжать.

0 голосов
/ 23 ноября 2018

Вы можете просто добавить атрибут get, который возвращает атрибуты в виде строки любым способом, который вам нравится ...

public class MyObject
{
    public int A { get; set; }
    public int B { get; set; }
    public string MyNewStringAttribute {
       get{
          return A + " and " + B;
       }
    }
}

Затем, когда вы можете сериализовать из контроллера, используя новый атрибут измассив, linq и т. д.

...