C# 의 데이터 저장방식인 직렬화(Serialize), 역직렬화(Deserialize) 도중 다음과 같은 예외가 뜰수도 있음.
System.MemberAccessException: '추상 클래스를 만들 수 없습니다'
'System.MemberAccessException' 형식의 예외가 mscorlib.dll에서 발생했지만 사용자 코드에서 처리되지 않았습니다. 추상클래스를 만들 수 없습니다.
우선 문제가 발생했던 코드는 아래와 같음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
enum icon
{
Null,
File,
Link
}
[Serializable]
public class ValueObject
{
public Enum[] state = Enumerable.Repeat(icon.Null, 16).ToArray();
public string[] name = new string[16];
public string[] infor = new string[16];
}
public partial class MainWindow : Window
{
private void Load_Data()
{
BinaryFormatter readFormatter = new BinaryFormatter();
FileStream readStream = new FileStream("data.dat", FileMode.Open, FileAccess.Read, FileShare.Read);
VO = (ValueObject)readFormatter.Deserialize(readStream);
readStream.Close();
}
}
|
cs |
- enum icon: 파일의 상태를 나태내기 위해 사용한 열거형
- ValueObject: 직렬화/역직렬화의 대상이 되는 데이터 클래스
- Load_Data( ): 데이터를 불러오는 함수이며, 역직렬화 과정임
여기서 문제가 되는 부분은 열거형임.
ValueObject 클래스에서 Enum[ ] 리스트가 포함되어 있는데, 이것때문에 추상클래스로 변화하여 문제가 발생함.
이에 관한 내용이 담긴 링크
https://social.msdn.microsoft.com/Forums/en-US/6551e338-747d-427b-b626-4232caffb74d/serialization-of-a-listltenumgt-in-c?forum=netfxremoting
따라서 직렬화/역직렬화의 대상이 되는 클래스가 추상클래스가 되지 않게하면 (enum을 사용하지 않으면) 해결됨
'Csharp' 카테고리의 다른 글
WPF - 프로그램 아이콘을 작업표시줄에서 숨기기 (0) | 2019.08.11 |
---|---|
WPF - 윈도우 배경을 불투명하게 설정 (0) | 2019.08.11 |
WPF - 파일 탐색기 (0) | 2019.08.05 |
C# - 코딩할 때 도움되는 자잘한 문법들 (2) | 2019.08.05 |
C#/WPF - 문자열로 객체 접근하는 법에 대한 해답 (0) | 2019.08.05 |