Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以在.net中扩展类属性吗?_C#_.net - Fatal编程技术网

C# 可以在.net中扩展类属性吗?

C# 可以在.net中扩展类属性吗?,c#,.net,C#,.net,我有一个图书馆。此库包含名为tPage的类。此tPage类未标记为可序列化。我无法修改此库。我需要序列化这个 如何扩展这个类属性 有可能吗?如果该类未标记为[Serializable],则无法序列化该类。如果从它继承,并将该属性应用于子类,序列化程序将引发异常,因为它无法序列化基类成员 解决这个问题有两种切实可行的方法: 创建一个新类t可序列化页面,该类包含与t页面相同的数据,并标记为[Serializable]。当您要执行序列化并将tSerializablePage传递给序列化程序时,将值从

我有一个图书馆。此库包含名为
tPage
的类。此
tPage
类未标记为可序列化。我无法修改此库。我需要序列化这个

如何扩展这个类属性


有可能吗?

如果该类未标记为
[Serializable]
,则无法序列化该类。如果从它继承,并将该属性应用于子类,序列化程序将引发异常,因为它无法序列化基类成员

解决这个问题有两种切实可行的方法:

  • 创建一个新类
    t可序列化页面
    ,该类包含与
    t页面
    相同的数据,并标记为
    [Serializable]
    。当您要执行序列化并将
    tSerializablePage
    传递给序列化程序时,将值从
    tPage
    实例复制到
    tSerializablePage
    实例。当此实例被反序列化时,您将负责根据其包含的值创建
    tPage
    的实例

  • tPage
    实现接口,以提供直接序列化和反序列化
    tPage
    实例的机制


如果您不熟悉手动序列化接口,前一种解决方案可能更容易实现,但是该接口是.NET Framework解决序列化不可序列化类问题的解决方案。

如果未标记该类,则无法序列化该类。
[serializable]
。如果从它继承,并将该属性应用于子类,序列化程序将引发异常,因为它无法序列化基类成员

解决这个问题有两种切实可行的方法:

  • 创建一个新类
    t可序列化页面
    ,该类包含与
    t页面
    相同的数据,并标记为
    [Serializable]
    。当您要执行序列化并将
    tSerializablePage
    传递给序列化程序时,将值从
    tPage
    实例复制到
    tSerializablePage
    实例。当此实例被反序列化时,您将负责根据其包含的值创建
    tPage
    的实例

  • tPage
    实现接口,以提供直接序列化和反序列化
    tPage
    实例的机制


如果您不熟悉手动序列化接口,则前一种解决方案可能更容易实现,但是该接口是.NET Framework解决序列化不可序列化类问题的解决方案。

它不可序列化可能是由于类的内部结构(例如,某些成员无法序列化)。因此,如果您可以对该类进行剖析/反向工程,并使其能够安全地进行序列化,请继续。否则,输入后的“黑客”将不适用于您


编程英雄
提出了很好的建议(在键入我的答案时看到了)。您可能想给他的想法一些想法。

它不可序列化,可能是由于类的内部结构(例如,某些成员无法序列化)。因此,如果您可以对该类进行剖析/反向工程,并使其能够安全地进行序列化,请继续。否则,输入后的“黑客”将不适用于您


编程英雄
提出了很好的建议(在键入我的答案时看到了)。您可能想给他的想法一些想法。

我假设您使用的是
BinaryFormatter
。首先,我认为,
BinaryFormatter
并不总是一个好主意(它确实是,而且经受不住太多的变化)。但我还建议,问题是您正在尝试序列化实现,而实际上您只需要序列化数据

我将通过编写表示系统状态的自己的DTO来解决此问题,并序列化DTO:

PageDto tmp = new PageDto(myPageInstance);
// serialize tmp
优点:

  • 您知道要序列化的数据(状态)
  • 它是不知情的;您可以使用不同的
    页面
    实现,这并不重要
  • 您可以通过使用适当的属性等来选择序列化程序
  • 当您更新
    页面
    库的版本时,它不会中断序列化(您的dto可以保持不变)

我假设您使用的是
BinaryFormatter
。首先,我认为,
BinaryFormatter
并不总是一个好主意(它确实是,而且经受不住太多的变化)。但我还建议,问题是您正在尝试序列化实现,而实际上您只需要序列化数据

我将通过编写表示系统状态的自己的DTO来解决此问题,并序列化DTO:

PageDto tmp = new PageDto(myPageInstance);
// serialize tmp
优点:

  • 您知道要序列化的数据(状态)
  • 它是不知情的;您可以使用不同的
    页面
    实现,这并不重要
  • 您可以通过使用适当的属性等来选择序列化程序
  • 当更新
    Page
    library版本时,它不会中断序列化(dto可以保持不变)