애플리케이션과 함께 배포하기 위해 읽기 전용 데이터를 어떻게 저장해야합니까?


17

데스크톱 응용 프로그램을 개발 중이며이 응용 프로그램을 실행하려면 일부 정보가 필요하지만이 정보는 변경되지 않습니다 (데이터 응용 프로그램을 실행할 때마다로드 되어야 하지만 데이터는 변경 되지 않습니다 ). 데이터는 앱이 실행되는 컴퓨터와 동일한 컴퓨터에 저장되어야합니다 (클라이언트 측 스토리지?).

사용자가이 정보를 쉽게 변경할 수없는 경우 (IT 지식이 많지 않다고 가정) 더 좋습니다.

이런 종류의 정보를 어떻게 저장해야합니까? 로컬 데이터베이스? 응용 프로그램과 함께 전송되는 XML?

WPF를 사용하고 있습니다.


2
이것은 메타가 아닙니다. 메타는 질문을하는 주요 사이트에 대한 문제 나 우려 사항을 논의하는 사이트입니다.
jpmc26

1
사용자가 정보를 변경하고 싶지 않은 이유는 무엇입니까? 그는인가 보안 문제 또는 무엇? 이 정보는 사용자로부터 비밀로 유지되어야합니까? 그 이유는 어떤 대답이 적절한지를 크게 바꿀 수 있습니다.
jpmc26

1
@ jpmc26 글쎄, 그것은 일종의 보안 문제이지만 큰 문제는 아닙니다. 애플리케이션의 주요 목적은 (같은 온도 제어기와 시리얼 포트를 통해 통신하는 하나), 및 XML 컨트롤러의 메모리 어드레스에 대한 정보를 저장한다. 사용자가 변경하면 실행 중에 문제가 발생할 수 있으므로 피하고 싶습니다. 그러나 내가 말했듯이 큰 문제는 아닙니다. 추신 : 대체 할 수있는 질문 편집 된 메타를 위한 SE를 . 감사.
appa yip yip

2
로컬 데이터베이스를 원하면 SQLite를 살펴보십시오. (하지만 시작할 때 데이터가 RAM에로드되기에 충분히 작은 경우 json 또는 이진 파일과 같은 간단한 구조화 된 파일을 선호합니다)
CodesInChaos

1
"사용자가 변경하면 실행 중에 문제가 발생할 수 있으므로 피하고 싶습니다." 전혀 보안 문제처럼 들리지 않습니다. 보안 문제는 파일에 암호 또는 이와 유사한 문구가있는 것입니다. 실행 파일 옆에 XML 파일로 설정을 저장하고 맨 위에 "이 파일의 설정을 건드리지 마십시오 !!"라는 주석을 추가하십시오. 사용자가 설치 디렉토리에서 임의의 파일을 편집하는 경우 손상된 부분이 있으면받을 자격이 있습니다.
Roger Lipscombe

답변:


14

이진 파일은 확실한 대답이지만로드 방법에 따라 다릅니다. 가능하면 인생을 쉽게 만들 수도 있습니다.

이것을 읽기 위해 C #에 내장 된 메소드가 있으므로 XML을 선택하는 것이 좋습니다. 데이터에 체크섬 을 추가 할 수 있으므로 사용자가 변경하면 체크섬이 더 이상 일치하지 않습니다 (체크섬이 유효한지 확인하려면 체크를 추가해야 함)

로컬 DB에 액세스해야 할 다른 종속성이 있기 때문에 더 많은 문제가 발생할 수 있습니다.


나는 체크섬에 대해 생각하지 않았다. 정말 좋은 생각이다. 그래서 체크섬을 생성하여 응용 프로그램에 저장하므로 XML을 직렬화 해제 할 때마다 새 체크섬을 생성하고 첫 번째 체크섬과 비교합니까?
appa yip yip

4
체크섬을 응용 프로그램에 저장하면 다른 구성을 허용하지 않으므로 구성 데이터를 응용 프로그램 상수로 코드에 저장할 수도 있습니다. 나중에 구성을 변경하려면 체크섬 (더 나은 용어는 "해시")을 XML 필드로 추가하고이를 사용하여 XML이 변경되지 않았는지 확인하십시오. 물론, 결정된 공격자는 코드를 조사하고 해시 논리를 찾아이를 사용하여 유효한 XML 파일을 생성 할 수 있지만 클라이언트 측 응용 프로그램은 항상 결정된 공격자에게 취약합니다.
SJuan76

4
파일 또는 로컬 db 대신 어셈블리에 포함 된 리소스 파일이 더 좋습니다. 최종 사용자에게 숨겨져 있으며 개발자가 쉽게 관리 할 수 ​​있지만 여전히 고급 사용자 친화적입니다. 성능이 중요한 경우 이진 직렬화가 우수합니다.
PTwr

@ SJuan76 예, XML의 해시 문제는 누군가 직렬화를 해제하면 변경 될 수 있다는 것입니다. 어쨌든 XML이 변경 되면 (생각하지 않을 것이라고 생각하지만 누가 아는가) 새로운 버전의 앱에서만 변경되므로 코드의 해시를 고수 할 것입니다.
appa yip yip

2
@schmaedeck : 리소스 파일은 말 그대로 실행 가능한 바이너리 안에있는 파일입니다. 아이콘과 문자열 및 프로그램에 필요한 기타 상수 데이터
Mooing Duck

21

데이터가 변경되지 않고 읽기 전용 인 경우 상수 목록으로 코드 파일에 넣으십시오.

public readonly string AppStartUpData = "MyAppNeedsThis";

이 데이터가 배치마다 다르면 외부 파일에 문제가 없습니다.

.Net에는 .config 파일 (App.Config)이 내장되어 있습니다. 프레임 워크에 내장 된 표준 방법이 있으므로 정보를 읽는 방법을 사용해야합니다.

텍스트 파일 (Xml)이므로 설정을 변경해야하는 경우에는 구성 파일을 사용하십시오. 민감한 정보가있는 경우 필요한 경우 설정을 암호화 할 수 있습니다.


상수 / 읽기 전용에 대해 생각했지만 문제는 많은 데이터 가 있다는 것이므로 외부 파일을 추적 할 것입니다. 감사합니다!
appa yip yip

5
@schmaedeck ... 그래서? 해당 정의를 별도의 파일에 넣고 가져올 수 있습니다. 실제로 Qt는 양식과 내용을 컴파일 할 때 이러한 종류의 작업을 수행하므로 일부 상수에 메가 바이트의 이진 데이터 (예 : 이미지)가있는 자동 생성 파일로 끝나지 만 별도의 파일에 있으면 아무런 문제가 없습니다. .
Bakuriu

15

항상 프로젝트에 파일을 추가 Embedded Resource하고 응용 프로그램 자체에 직접 포함되도록 빌드 유형을 설정할 수 있습니다.

또는 암호화되어 액세스 가능한 위치에있는 파일입니다.


1
이것이 가장 좋은 대답입니다. 그것을 달성하는 방법에 대한 더 많은 지침을보고 싶습니다. 잠재적으로 변경 가능한 구성 파일 의 이점을 얻을 수 있지만 어셈블리에 포함 된 파일을 그대로 유지하십시오.
Gusdor

5

사용자가 데이터를 들여다 보지 못하게하려면 이진 데이터 파일로 직렬화해야합니다.

앱에서만 읽을 청크의 길이를 알 수 있습니다.

C #을 모르지만 Java에서는 다음과 같이 파일을 작성합니다.

FileOutputStream fos = new FileOutputStream(file);      
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(var1);
oos.writeObject(var2);
oos.writeObject(var3);
oos.writeObject(var4);

... 그리고 그들은 다음과 같이 읽습니다.

FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Object o[] = new Object[4];
o[0] = ois.readObject();
o[1] = ois.readObject();
o[2] = ois.readObject();
o[3] = ois.readObject();

반드시 이진 직렬화를 사용하겠습니다. 시간 내 주셔서 감사합니다!
appa yip yip
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.