CA2236: ISerializable 형식에서 기본 클래스 메서드를 호출하십시오.
TypeName |
CallBaseClassMethodsOnISerializableTypes |
CheckId |
CA2236 |
범주 |
Microsoft.Usage |
변경 수준 |
주요 변경 아님 |
원인
형식이 System.Runtime.Serialization.ISerializable 인터페이스를 구현하는 형식에서 파생되고 다음 조건 중 하나에 해당합니다.
형식이 serialization 생성자 즉, System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext 매개 변수 시그너처가 있는 생성자를 구현하지만 기본 형식의 serialization 생성자를 호출하지 않습니다.
형식이 ISerializable.GetObjectData 메서드를 구현하지만 기본 형식의 GetObjectData 메서드를 호출하지 않습니다.
규칙 설명
사용자 지정 serialization 프로세스에서 형식은 GetObjectData 메서드를 구현하여 필드를 serialize하고 serialization 생성자를 구현하여 필드를 deserialize합니다.형식이 ISerializable 인터페이스를 구현하는 형식에서 파생되는 경우 기본 형식의 GetObjectData 메서드 및 serialization 생성자를 호출하여 기본 형식의 필드를 serialize 및 deserialize해야 합니다.이렇게 하지 않으면 형식이 올바르게 serialize 및 deserialize되지 않습니다.파생된 형식이 새로운 필드를 추가하지 않는 경우 형식은 GetObjectData 메서드 또는 serialization 생성자를 구현하거나 이에 해당하는 기본 형식의 요소를 호출할 필요가 없습니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 해당하는 파생된 형식의 메서드나 생성자에서 기본 형식의 GetObjectData 메서드나 serialization 생성자를 호출합니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.
예제
다음 예제에서는 기본 클래스의 serialization 생성자와 GetObjectData 메서드를 호출하여 규칙을 충족하는 파생된 형식을 보여 줍니다.
Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions
Namespace UsageLibrary
<SerializableAttribute> _
Public Class BaseType
Implements ISerializable
Dim baseValue As Integer
Sub New()
baseValue = 3
End Sub
Protected Sub New( _
info As SerializationInfo, context As StreamingContext)
baseValue = info.GetInt32("baseValue")
End Sub
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overridable Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext) _
Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
<SerializableAttribute> _
Public Class DerivedType: Inherits BaseType
Dim derivedValue As Integer
Sub New()
derivedValue = 4
End Sub
Protected Sub New( _
info As SerializationInfo, context As StreamingContext)
MyBase.New(info, context)
derivedValue = info.GetInt32("derivedValue")
End Sub
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overrides Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext)
info.AddValue("derivedValue", derivedValue)
MyBase.GetObjectData(info, context)
End Sub
End Class
End Namespace
using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
namespace UsageLibrary
{
[SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}
[SerializableAttribute]
public class DerivedType : BaseType
{
int derivedValue;
public DerivedType()
{
derivedValue = 4;
}
protected DerivedType(
SerializationInfo info, StreamingContext context) :
base(info, context)
{
derivedValue = info.GetInt32("derivedValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public override void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("derivedValue", derivedValue);
base.GetObjectData(info, context);
}
}
}
관련 규칙
CA2240: ISerializable을 올바르게 구현하십시오.
CA2229: serialization 생성자를 구현하십시오.
CA2238: serialization 메서드를 올바르게 구현하십시오.
CA2235: 모두 serialize할 수 없는 필드로 표시하십시오.
CA2237: ISerializable 형식을 SerializableAttribute로 표시하십시오.