C#类型序列化不作为键值对的集合

时间:2018-11-22 21:55:09

标签: serialization serializable datacontract

我有一个类,在进行序列化时,我想作为没有键值对的单个字符串返回。字符串变成字符串。一个int成为一个int。如何使我的班级变成字符串?

查看 DataContract 可序列化,看起来这是不可能的。 SerializationInfo.AddValue(name,value)设置会将您的整个对象强制为键值方法。我只想返回“ A和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上添加自定义序列化,并相应地设置One和Two,但是我不想这样做,我希望我的新类在任何地方都可以作为字符串进行序列化。

我可以将类型序列化为单个返回值吗?还是除了内置类型(如int和string)之外的所有类型都必须序列化为对象?

2 个答案:

答案 0 :(得分:0)

您可以简单地添加一个get属性,以任何您喜欢的方式将属性作为字符串返回...

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

然后,当您可以使用数组,linq等中的new属性从控制器进行序列化时。

答案 1 :(得分:0)

我的答案:不能。

父类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());
    }
}

咕umble咕umble ...将其添加到.NET出错的一长串内容中。静态/非接口类适用于所有内容,因此默认情况下无法测试框架,而无需为所有内容创建“即插即用”包装器。具有有损MSIL /符号的编译器。我可以继续下去。