C# 类型序列化不是键值对的集合
C# type serialization not as a collection of key value pairs
我有一个 class,当序列化时,我想 return 作为没有键值对的单个字符串。一个字符串变成一个字符串。一个整数变成一个整数。如何让我的 class 变成一个字符串?
查看 DataContract 和 Serializable,看起来这不可能。 SerializationInfo.AddValue(name, value) 设置强制您的整个对象采用键值方法。我只想return"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
}
假设我有一个使用这两种自定义类型的父 class:
[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 上添加自定义序列化,相应地设置一和二,但我不想这样做,我希望我的新 class 序列化为到处都是字符串。
我可以将类型序列化为单个 return 值吗?还是除了 int 和 string 等内置类型之外的所有类型都必须序列化为一个对象?
您可以简单地添加一个获取属性,returns 以您喜欢的任何方式将属性作为字符串...
public class MyObject
{
public int A { get; set; }
public int B { get; set; }
public string MyNewStringAttribute {
get{
return A + " and " + B;
}
}
}
然后,当您可以使用来自数组、linq 等的新属性从控制器进行序列化时
我的回答:不能。
父级 class、MyObject
必须实现 ISerializable
以提供 class 本身的自定义序列化。这让每个 class 希望使用它的人都有责任按照预期的方式正确序列化 class,这是一种不受欢迎的体验,并突出了受支持的 .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 出错的长列表中。静态/非接口 classes 用于默认情况下使框架不可测试的所有内容,而无需为所有内容创建插件 n-chug 包装器。有损 MSIL/symbols 的编译器。我可以继续下去。
我有一个 class,当序列化时,我想 return 作为没有键值对的单个字符串。一个字符串变成一个字符串。一个整数变成一个整数。如何让我的 class 变成一个字符串?
查看 DataContract 和 Serializable,看起来这不可能。 SerializationInfo.AddValue(name, value) 设置强制您的整个对象采用键值方法。我只想return"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
}
假设我有一个使用这两种自定义类型的父 class:
[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 上添加自定义序列化,相应地设置一和二,但我不想这样做,我希望我的新 class 序列化为到处都是字符串。
我可以将类型序列化为单个 return 值吗?还是除了 int 和 string 等内置类型之外的所有类型都必须序列化为一个对象?
您可以简单地添加一个获取属性,returns 以您喜欢的任何方式将属性作为字符串...
public class MyObject
{
public int A { get; set; }
public int B { get; set; }
public string MyNewStringAttribute {
get{
return A + " and " + B;
}
}
}
然后,当您可以使用来自数组、linq 等的新属性从控制器进行序列化时
我的回答:不能。
父级 class、MyObject
必须实现 ISerializable
以提供 class 本身的自定义序列化。这让每个 class 希望使用它的人都有责任按照预期的方式正确序列化 class,这是一种不受欢迎的体验,并突出了受支持的 .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 出错的长列表中。静态/非接口 classes 用于默认情况下使框架不可测试的所有内容,而无需为所有内容创建插件 n-chug 包装器。有损 MSIL/symbols 的编译器。我可以继续下去。