当前位置: 首页 > 知识库问答 >
问题:

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

何越
2023-03-14

我有一个类,当序列化时,我想作为一个没有键值对的字符串返回。字符串变为字符串。int变为int。如何使类变为字符串?

查看Data的合同和序列化,看起来这是不可能的。SeriezationInfo. addValue(名称,值)设置强制您的整个对象进入键值方法。我只想返回“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 上添加自定义序列化,相应地设置 1 和 2,但我不想这样做,我希望我的新类在任何地方都序列化为字符串。

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

共有2个答案

邵劲
2023-03-14

我的回答:不能。

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

咕噜咕噜...将此添加到 .NET 出错的一长串内容中。所有内容的静态/非接口类使框架默认情况下无法测试,而无需为所有内容创建 plug-n-chug 包装器。具有有损 MSIL/符号的编译器。我可以继续说下去。

仉俊能
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 我有一堂课 并希望将其序列化为 如何实现此目标(以及如何反序列化为对象? 我正在尝试使用 但显然最终会引号过多。 也不起作用,因为它不能创建足够的报价。 问题答案: 我发现了一种使用JsonSerializer的方法: 本类需要了解这一点: 反序列化非常相似: 这也需要在Foo类上进行注释:

  • 嗨,我正面临着地图序列化的问题,其中关键是一个自定义类。

  • 我正在尝试将文件从mongoDB读取到本地。 我的代码如下:STRING=“myLocalPath”PATH=STRING.json 我得到错误-对象类型'ObjectId'是不是JSON序列化...请建议。

  • 问题内容: 我有以下代码在引用时可在控制台应用程序中使用 当我更新对我的引用时,得到: 找不到play.api.libs.json.JsObject类型的Json序列化程序作为JsObject。尝试为此类型实现隐式OWrites或OFormat。 然后 val collection = db.collectionJSONCollection 我究竟做错了什么? 问题答案: ReactiveMong

  • 问题内容: 我不清楚序列化/反序列化应该如何在JavaScript中的类型化对象上工作。例如,我有一个“ MapLayer”对象,其中包含各种成员和数组。我已经编写(但尚未测试)以下代码以尝试对其进行序列化: 我的问题是,如何将生成的对象反序列化为MapLayer对象而不是通用对象。以及如何将所有Sprite实例反序列化为sprite。我应该使用“ new MapLayer()”而不是“ {}”吗

  • 我有一个看起来很常见的问题,但到目前为止,我还没有找到一个适合我的解决方案。我想我只是错过了一些小事情,但我已经崩溃了,请求帮助。我正在尝试使用flask和pymongo获得json输出。 以下是控制台中使用print(结果)的对象: 当我试图返回时,我得到了错误: TypeError: ObjectId类型的对象不是JSON可序列化的 类联系人(资源): 我试过bson。json_util建议。