父类已实现ISerializable接口,子类没有添加可序列化特性

ddddouche 2015-08-26 09:06:41


在Java解惑上看到这样一个题目,想用序列化对Dog 的实例进行深拷贝。在不对Dog对象添加[ [Serializable] 特性时,使用Binary序列化时,出现异常。请问父类实现了ISerializable接口时,子类又没标准为可序列化的情况下,如何实现对象的拷贝???


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;

namespace DeSerializable
{
public class Dog : Exception
{
public readonly string Name = "David Lee";
public static Dog Instrance = new Dog();

private Dog()
{
}
public override string ToString()
{
return string.Format("{0}小狗汪汪叫!", Name);
}
}


class Program
{
static void Main(string[] args)
{
Dog dog = DeepCopyDog();
Dog originalDog = Dog.Instrance;
if (ReferenceEquals(dog,originalDog))
{
Console.WriteLine("深拷贝失败");
}
else
{
Console.WriteLine("拷贝成功,恭喜");
}
Console.ReadLine();
}
public static Dog DeepCopyDog()
{
Dog dog = Dog.Instrance;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bfFormatter = new BinaryFormatter();
bfFormatter.Serialize(ms, dog);
ms.Position = ms.Seek(0, SeekOrigin.Begin);
return bfFormatter.Deserialize(ms) as Dog;
}
}
}
}
...全文
475 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
本拉灯 2015-08-26
  • 打赏
  • 举报
回复
引用 2 楼 ddddouche 的回复:
嗯,我只想了解下是否有方法处理这个问题. 感觉每次都要对子类添加这个特性,略麻烦。
你要序列化子类,不管父类有没有[Serializable] ,序列的那个类必需要有[Serializable]
ddddouche 2015-08-26
  • 打赏
  • 举报
回复
嗯,我只想了解下是否有方法处理这个问题. 感觉每次都要对子类添加这个特性,略麻烦。
Poopaye 2015-08-26
  • 打赏
  • 举报
回复
BinaryFormatter的本质就是反射,所以java的题目套用到c#上来是没意义的
资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在 C# 的面向对象编程中,将父类对象的属性值复制到子类对象是一个常见需求。父类是定义了一组属性和方法的基础类,而子类是从父类继承并可能扩展更多功能的派生类。这种继承机制使得子类可以复用父类代码,同时还可以添加新的特性。当需要将父类对象的属性值传递给子类对象时,目标通常是保留父类的所有属性值,并在子类中初始化额外的属性。 以下是几种实现父类子类属性赋值的方法: 构造函数参数:子类的构造函数可以接收一个父类对象作为参数,然后在构造函数内部,通过直接赋值或使用 base 关键字调用父类构造函数来完成属性赋值。例如: 使用 MemberwiseClone():C# 的 System.Object 类提供了 MemberwiseClone() 方法,用于创建对象的浅拷贝。但这种方法仅适用于简单类型的成员,因为它只复制引用而不复制引用的对象。如果父类包含引用类型,可能会导致意外结果。 序列化与反序列化:可以将父类对象序列化为字节数组,然后反序列化子类对象。这种方法适用于复杂对象结构,但效率较低,且需要实现 ISerializable 接口。 属性映射:可以使用辅助工具(如 AutoMapper)或自定义映射逻辑,将父类的属性逐个映射到子类的对应属性。这种方法灵活且易于维护,但如果没有外部库支持,需要编写额外代码。 反射:通过反射遍历父类的所有公共属性并赋值给子类。这种方法通用性强,但性能较低,且代码可读性较差。 使用 C# 9.0 的记录类型(Records):在 C# 9.0 及更高版本中,记录类型提供了简洁的语法来创建不可变类型,并支持浅拷贝。如果父类子类都是记录类型,可以通过 with 表达式实现父类子类的赋值。 在实际开发中,选择哪种方法取决于具体需求,包括性能、代码可读性和维护

111,112

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧