gpt4 book ai didi

c# - 当我想完全按照没有添加 ISerializable 时它会做什么时,如何在具有 [Serializable] 的类上实现 ISerializable?

转载 作者:行者123 更新时间:2023-11-30 14:36:41 26 4
gpt4 key购买 nike

我有一个类,其中包含我正在序列化的一些数据:

[Serializable]
public class SomeData {
public int NumericField;
public string StringField;
}

我有一个非常方便的扩展方法:

public static string ToJson<T> (this T value) {
// yay no compile-time checks for [Serializable]?
if (!typeof(T).IsSerializable)
throw new SerializationException("Object lacks [Serializable] attribute");

var serializer = new DataContractJsonSerializer(typeof(T));

using (var stream = new MemoryStream()) {
using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8)) {
serializer.WriteObject(writer, value);
}

return Encoding.UTF8.GetString(stream.ToArray());
}
}

我真的宁愿上课SomeData已实现 ISerializable ,但是当我添加它时,我被告知我需要添加一个方法:

error CS0535: 'SomeData' does not implement interface member
System.Runtime.Serialization.ISerializable.GetObjectData(
System.Runtime.Serialization.SerializationInfo,
System.Runtime.Serialization.StreamingContext)'

问题只是我希望它完全做它当前做的事,但也限制ToJson<T>ISerializable类,因此没有人会不小心传递给它一些会引发可避免的异常的东西。像这样:

public static string ToJson<T> (this T value) where T : ISerializable

有没有GetObjectData的简洁实现?或者其他一些技巧,如果我不添加 ISerializable,它只会复制我会得到的确切行为界面?我想要一些我可以只包含在我继承的类中的东西,或者一些简洁的东西(并且总是完全相同的)我可以粘贴到我只想要的所有类中 [Serializable]确实发生了。通用的东西。性能不是一个大问题,但我只能使用 .Net Framework 3.5。

更新:

我非常愿意使用 [DataContract]代替[Serializable] , 但如果我这样做了,有没有一种通用的方法可以实现 ISerializable所以它确实做了[DataContract]如果我没有实现 ISerializable 会怎样? (与上面相同的 qn 与 DataContract 随处可见 Serializable )

最佳答案

你根本不需要ISerializable,也不需要自己抛出SerializationException。如果类型不可序列化,DataContractJsonSerializer 将引发异常。实际上有几个选项可以使用这个序列化器来序列化一个类型:

  • 可序列化属性
  • DataContract 属性
  • ISerializable 接口(interface)
  • 无(适用于公共(public)类型并序列化所有公共(public)字段和属性)

让序列化程序执行检查将支持所有这些。

更新

经过评论的一番讨论,我想强调这一点:

可能永远不会对可序列化性进行编译时检查(至少从 C# 5.0 开始)。将对象标记为 Serializable 或什至实现 ISerializable 接口(interface)并不能保证序列化程序不会在对象图中遇到不可序列化的类型并在运行时抛出异常.

关于c# - 当我想完全按照没有添加 ISerializable 时它会做什么时,如何在具有 [Serializable] 的类上实现 ISerializable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10265602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com