Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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# 混合自定义和基本序列化?_C#_Xml_Serialization - Fatal编程技术网

C# 混合自定义和基本序列化?

C# 混合自定义和基本序列化?,c#,xml,serialization,C#,Xml,Serialization,我有一个拥有100多个属性的类(这是一个数据库映射类),其中一个属性必须在一个方法中。换句话说,该数据不是通过属性公开的,而是通过方法公开的: ABCType GetABC(),SetABC(ABCType值) 这一切都很不正常。我一看到它就发抖 该类需要可序列化,以便可以通过web服务发送,并且Get/Set方法公开的数据也需要序列化。(这是在一个方法中,因为我使用的网格在反射方面做了一件奇怪的事情;它无法处理包含与包含对象相同类型属性的对象。problem属性存储数据库对象的原始状态,以防需

我有一个拥有100多个属性的类(这是一个数据库映射类),其中一个属性必须在一个方法中。换句话说,该数据不是通过属性公开的,而是通过方法公开的:

ABCType GetABC(),SetABC(ABCType值)

这一切都很不正常。我一看到它就发抖

该类需要可序列化,以便可以通过web服务发送,并且Get/Set方法公开的数据也需要序列化。(这是在一个方法中,因为我使用的网格在反射方面做了一件奇怪的事情;它无法处理包含与包含对象相同类型属性的对象。problem属性存储数据库对象的原始状态,以防需要还原。是的,实现效率低下-但我无法重新设计它。)


我的问题是:因为只有这个1字段需要自定义序列化代码,所以我只想在调用GetABC和SetABC时使用自定义序列化,在类的其余部分恢复为基本的XML序列化。这将最大限度地减少序列化代码中可能出现的错误。有办法吗?

我要尝试的第一件事是添加一个用于序列化的属性,但将其隐藏在UI中:

[Browsable(false)] // hide in UI
public SomeType ABC {
    get {return GetABC();}
    set {SetABC(value);}
}
不幸的是,你不能真正地混搭;一旦实现了
IXmlSerializable
,您就拥有了一切。如果您使用的是WCF,则
DataContractSerialier
支持序列化的非公共属性,因此您可以使用:

[DataMember]
private SomeType ABC {
    get {return GetABC();}
    set {SetABC(value);}
}
但这不适用于通过
XmlSerializer
的“asmx”web服务


[Browsable]
技巧是否有效?假设自定义网格使用
TypeDescriptor
,另一个选项可能是通过
ICustomTypeDescriptor
隐藏它,但仅仅隐藏属性就需要大量的工作…

可浏览]技巧不起作用,因为它不会从网格对typeof(SomeType)的调用中隐藏属性。GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);但是您确实回答了关于混合序列化的问题,所以谢谢!