2013-08-13 13 views
6

Ben nesne (I örn baskı teselli etmeye hangi.)Java SnakeYaml - Referans isimlerini damping önlemek

@Nonnull 
private String outputObject(@Nonnull final ObjectToPrint packageSchedule) { 
    DumperOptions options = new DumperOptions(); 
    options.setAllowReadOnlyProperties(true); 
    options.setPrettyFlow(true); 
    return new Yaml(new Constructor(), new JodaTimeRepresenter(), options).dump(ObjectToPrint); 
} 

Tüm iyi, ama bazıları için yaml temsil dönüştürülür almak için kullandığınız aşağıdaki yöntemi var ObjectToPrint yapısında bulunan nesne, gerçek nesne içeriği gibi referans adı gibi bir şey elde ediyorum.

!!com.blah.blah.ObjectToPrint 
businessYears: 
- businessYearMonths: 12 
    ppiYear: &id001 { 
    endDate: 30-06-2013, 
    endYear: 2013, 
    startDate: 01-07-2012, 
    startYear: 2012 
    } 
    ppiPeriod: 
    ppiYear: *id001 
    endDate: 27-03-2014 
    startDate: 21-06-2013 
    units: 24.000 
    number: 1 

I ($id001 olarak işaretli) baskılı ppiYear nesne vardır ve aynı nesne ppiPeriod kullanılır ve sadece referans adı değil nesne içeriği basılır Yukarıdaki örnekte de görüldüğü gibi. Nesne içeriğim, bu nesneyi, yamlüme dönüştürülmesini istediğim yapı içinde kullanırım (ObjectToPrint). PS. Referans ismini (&id001) basmamak iyi olur ama bu önemli değil.

cevap

4

Bunun nedeni aynı nesneyi farklı yerlere göndermenizdir. Bunu önlemek için, bu nesnelerin kopyalarını oluşturmanız gerekir. Yaml'in bunu kapatacak bir bayrağı yoktur, çünkü döngüsel referanslar söz konusu olduğunda sonsuz döngülere girebilirsiniz. çift başvuruları görmezden Yaml kaynak kodunu küçük değişiklikler yapabilir Ancak: Serializer hat ~ 170 yöntemi serializeNode de

göz:

... 
if (this.serializedNodes.contains(node)) { 
    this.emmitter.emit(new AliasEvent(...)); 
} else { 
    serializedNodes.add(node); // <== Replace with myHook(serializedNodes,node); 
... 

void myHook(serializedNodes,node) { 
    if (node's class != myClass(es) to avoid) { 
     serializedNodes.add(node); 
    } 

Eğer serializedNodes koleksiyona düğümleri koymak yaml önlemek için bir yol bulmak eğer, senin Problem çözülecektir, ancak programınız döngüsel referanslar durumunda sonsuz olacaktır.

En iyi çözüm, sadece düz yazılmasını istediğiniz sınıfı kaydetmekten kaçınan bir kanca eklemektir.

+0

Sadece çok yorum ** (this.serializedNodes.contains (düğüm)) { this.emitter.emit halinde (yeni AliasEvent (tAlias, boş, boş)); } else {} serializeNode yönteminden ** ve anchorNode (düğüm); ** serialize yönteminden. Bu çapa ve takma adlar oluşturmayı engelledi. – Ajeesh

+0

OP'nin sorduğu şey budur :-). Bazı sınıflar için yalnızca ref tespitini kapatmak için myHook'u doğru bir şekilde uygulamanız gerekir. –

İlgili konular