2014-09-22 3 views
2

저는 직장에서 배정 된 작업을 맡았습니다. 클라이언트 측 설정이 지속되어야합니다. 이러한 설정은 구현중인 프레임 워크의 C# 버전에서 XML 파일로 표시되며 최대 6 개 수준의 계층 구조를 가진 객체를 나타냅니다. 또한 여러 레벨의 오브젝트 수는 ArrayList와 같이 임의적입니다. 객체 직렬화는 불행하게도 파일을 직접 편집 할 수 있어야하기 때문에 옵션이 아닙니다. 이러한 설정을 .properties 파일로 유지해야한다는 것을 암시하는 것 이상의 의미가 있지만 그게 좋은 생각인지에 대해 우려를 표합니다..properties 파일은 계층 적 설정 - 개체를 저장하는 데 적합합니까?

필자가 아는 한 .properties 파일은 HashMap과 동일한 방법으로 만 사용할 수 있으며 String과 키 - 값 쌍으로 만 사용할 수 있습니다. 복잡한 객체의 표현은 길고 복잡한 키 문자열로만 가능하며 모든 단일 요소의 전체 "경로"를 나타냅니다. 여기에는 가능한 여러 목록의 개별 색인이 포함됩니다.

filters.filter3.traces.rule4.add1.value="8" 

나는 .properties의 파일에 계층 적 개체를 유지하기 위해 어떤 점잖은 방법을 찾을 수 없어,하지만 난 하나, 그것은 불가능하다고 어떤 확실한 증거를 찾을 수 없어.

따라서 계층 적 설정 - 개체를 저장하기에 적합한 .properties 파일이 있습니까? 아니면 대신 XML 파일이나 JSON으로 내 속성을 구현해야합니까?

+0

JSON을 살펴보십시오. 예를 들어, [GSON] (https://code.google.com/p/google-gson/)은 JSON에 대한 간편한 직렬화를 지원합니다. –

+0

JSON에 익숙하지만 .properties 파일과 결합 할 수 있습니까? 나는 그 예를 찾을 수 없었다. – KjetilNordin

+0

속성 파일을 사용하더라도 파일을 수동으로 편집하면 비 직렬화가 중단되지 않습니까? – manouti

답변

1

나는 XML 파일을 고수 할 것이다. API 프레임 워크의 다양한 변형과 ​​다른 형식을 갖는 것보다 사용자를 괴롭히는 것은 없습니다.

Apache XMLBeans와 같은 라이브러리를 사용하여 스키마 파일을 사용하여 적절한 Java 클래스를 자동 생성하는 XML 파일 읽기 및 쓰기 프로세스를 단순화 할 수 있습니다.

속성 파일은 계층 적 데이터를 저장하는 데 사용할 수 있지만 손으로 ​​해당 내용을 편집하는 것은 정말 고통스럽고 오류가 발생하기 쉽습니다. 어떤 사람들은 XML 편집이 쉽지는 않지만 적어도 XSD와 연결될 때 이것을 쉽게 할 수있는 편집기가 존재한다고 주장합니다.

+0

이것은 내가 이미 뭘 의심하는지 확인합니다. 이 사실을 확인하는 기사에 대한 링크가없는 건가요? 또는 그 문제에 대해 다른 사람? – KjetilNordin

+0

@KjetilNordin 아니, 정말로. 나는 약간을 위해 Google을 할 수 있었다, 그러나 나는 당신이 이미 그것을했다는 것을 짐작한다. 왜 기사가 더 명확할까요? 아마도이 질문을 잠시 동안 풀어보고 다양한 답이 얼마나 많은 득표를했는지를 지적하십시오. –

+0

나는 적어도 많이 시도했다. 그것은 실제로 어떤 것도 찾을 수 없지만 좋은 예는 없습니다. 자원 부족으로 항상 가능하지 않다는 것을 의미하지는 않습니다. 그래서 주제에 관해 무엇인가를 찾으려고 정말로 도움이 필요했습니다. 필자는 어떤 종류의 문서 소스를 좋아하지만 두 번째 의견 세트도 매우 유용합니다. 귀하의 대답은 지금까지 최고입니다. 조금 더 오랫동안 열어 두도록하겠습니다. Stack Exchange는 의견을 바탕으로 한 질문과 답변을 실제로 열지는 못합니다. 그러나 어떤 증거가없는 한, 당신의 의견을 받아 들일 것입니다. ;) – KjetilNordin

1

나는 항상 계층 적 구성 데이터를 저장하는이 방법이 상당히 번거롭다는 것을 알았지 만 아주 잘 수행 할 수 있습니다. 예를 들어, Log4j를 구성하는 가장 일반적인 방법은 (예전에 사용되던 것입니까?)하지만 제 경험으로 볼 때 점점 더 많은 개발자들이 여기서 XML로 전환하고 있습니다.

이 목적을 위해 속성 파일을 사용하는 지점을 실제로 보지 못했습니다.

+0

나도. 두 번째 의견을 주셔서 감사합니다. – KjetilNordin

1

나는 당신이 이미 그것의 요지를 가지고 있다고 생각한다. 자바 속성 파일은 계층을 표현할 수 있지만 어색하다.

Typesafe Config library을 살펴보십시오.이 부분은 Play Framework입니다. 기본 언어는 HOCON (사람이 최적화 한 구성 표기법)으로 계층 적 속성 표현에 적합합니다. 라이브러리는 또한 속성 파일과 JSON 모두에서 잘 작동하므로 이러한 모든 언어를 동시에 쉽게 지원할 수 있습니다. 당신이 말했듯이 Java 특성 파일에서

는, 당신은 단지 사용 점선 키

a.b.c = 42 

HOCON에서 제한하고, 당신이 그렇게 중 하나를 선택할 수 있습니다 또는 중괄호 둥지 섹션.그 예는 다음과 같은 방법으로 표현 될 수 있도록 :

a.b.c : 42 

a { 
    b.c : 42 
} 

a.b { 
    c : 42 
} 

a { 
    b { 
     c : 42 
    } 
} 
+1

나는 이것을 "계층 적 객체 표기법에 적합하지 않은 특성이 없음"이라고 생각합니다. – KjetilNordin

+0

질문에 직접 답하는 대답을 확장했습니다. –

1

을 당신은 log4j의 형태로 완벽한 예를 여기 here에서 속성 샘플입니다.

log4j.appender.R = org.apache.log4j.DailyRollingFileAppender 
log4j.appender.R.File = logs/bensApps.log 
log4j.appender.R.Append = true 
log4j.appender.R.DatePattern = '.'yyy-MM-dd 
log4j.appender.R.layout = org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n 

당신 같은 사람 키의 계층 구조가있는 경우 :

Map<String,Object> root = new HashMap<>(); 
root.put("level1", "foobar"); 
root.put("level2", Collections.singletonMap("p", "foobar"); 

을 그것은 당신까지로 번역하는 것입니다

level1=foobar 
level2.p=foobar 

그리고 파일을 읽을 때, 분할 서브맵에 . :

Map<String, Object> root = new HashMap<>(); 
Properties propz = new Properties(); 
// load from your file 
for (Map.Entry<String,Object> entry : propz.entrySet()) { 
    String[] path = entry.getKey().split('\\.'); 
    Map<String,Object> parent = root; 
    int n = path.length - 1; 
    for (int i = 0; i < n; ++i) { 
    String p = path[i]; 
    Object child = parent.get(p); 
    if (null == child) { 
     Map<String,Object> _p = new HashMap<>(); 
     parent.put(p, _p); 
     parent = _p;  
    } else if (child instanceof Map) { 
     parent = (Map<String,Objext>) child; 
    } else { 
     // it is up to you to do something when the path extends beyond a "final" key 
    } 
    } 
    parent.put(path[n], entry.getValue()); 
} 

그러나 이것은 "바퀴의 재발견"패턴이며, 다른 해결책은 스스로 해결하는 것보다 더 나은 해결책을 제시합니다. 이 발생하지 않습니다

p1=foobar 
p1.p2=foobar 

기계 생성 된 속성의 경우, 예외는 아마도 가장 좋은 대답입니다 :이 예는 또한 당신에게 문제의 종류를 보여줍니다. 그러나 인간이 조작 한 속성의 경우에는 이것이 의미가있을 수 있습니다.

Java 7은 JAXB와 함께 제공되기 때문에 추가 라이브러리 없이도 전체 XML로 수행 할 수 있습니다. 그리고 일종의 계층 구조를 사용합니다.

+0

이것은 단순한 String과 여러 필드가있는 객체 또는 자식 객체 모두에 객체를 설정할 수 있으므로 계층 적 속성의 읽기/쓰기와 가능한 오류에 대해 발생할 수있는 복잡성에 대한 훌륭한 설명이라고 생각합니다. . 이미 프로젝트에서 JAXB를 사용하고 있으며 구성이 C# .net 버전의 프레임 워크 용 XML 파일로 이미 존재합니다. 나는 .properties에서 이것을하는 것의 이점을 보지 못하고, 같은 방식으로 당신의 결합 된 응답을 해석한다. – KjetilNordin

+0

Log4j의 경우 XML 구성 모드 이전이라고 생각합니다. 그리고 구성해야 할 일의 복잡성과 필요성에 달려 있습니다. 간단한 key = value 속성을 고수 할 것입니다. – NoDataFound

관련 문제