2015-02-01 5 views
1

Я хочу прочитать содержимое двух файлов xml, содержащих информацию, хранящуюся как ArrayList, из двух классов. Мне нужно использовать XStream, и у меня нет проблем с записью файлов, но чтение из они, похоже, вызывают проблемы. Эти два класса:XStream не может найти конкретный класс для unmarshall XML

public class CreditCard 
{ 
    private String creditCard; 
    private ArrayList<String> tokens; 

    public CreditCard(String creditCard, ArrayList<String> tokens) 
    { 
    this.creditCard = creditCard; 
    this.tokens = tokens; 
    } 
} 

и

public class Account 
{  
private String username; 
private String password; 
private AccessRights accessRights; 

public Account(String username, String password, AccessRights accessRights) 
    { 
    this.username = username; 
    this.password = password; 
    this.accessRights = accessRights; 
    } 
} 

Где AccessRights просто `

public enum AccessRights { 
    FULL_RIGHTS, 
    TOKENS_ONLY, 
    CREDIT_CARD_ONLY; 
} 

Я пишу файлы в основной функции для тестирования.

public static void main(String[] args) throws IOException, ClassNotFoundException 
{ 
    XStream xstream = new XStream(new StaxDriver()); 
    Writer someWriter = new FileWriter("Accounts.xml");   
    ObjectOutputStream out = xstream.createObjectOutputStream(someWriter); 

    Account one = new Account("Pesho", "0000", AccessRights.FULL_RIGHTS); 
    Account two = new Account("Kosio", "0809", AccessRights.TOKENS_ONLY); 

    ArrayList<Account> accounts = new ArrayList<>(); 
    accounts.add(one); 
    accounts.add(two); 

    xstream.alias("account", Account.class); 

    out.writeObject(accounts); 
    out.close(); 

    XStream xstreamcr = new XStream(new StaxDriver()); 
    Writer someWritercr = new FileWriter("CreditCards.xml");   
    ObjectOutputStream outcr = xstreamcr.createObjectOutputStream(someWritercr); 

    ArrayList<String> tokens = new ArrayList<>(); 
    tokens.add("1234243434269991"); 
    tokens.add("7892641434269991"); 
    CreditCard crone = new CreditCard("4563960122019991", tokens); 
    ArrayList<CreditCard> test = new ArrayList<>(); 
    xstreamcr.alias("creditcard", CreditCard.class); 
    test.add(crone); 
    outcr.writeObject(test); 
    outcr.close(); 
} 

Я хочу иметь функцию void, которая читается из этих файлов. Что-то вроде этого:

public void read(){ 
    ArrayList<Account> accountsin; 
    XStream xstreamin = new XStream(new StaxDriver()); 
    Reader someReader = new FileReader("Accounts.xml"); 
    ObjectInputStream in = xstreamin.createObjectInputStream(someReader); 
    accountsin = (ArrayList<Account>) in.readObject(); 
    in.close(); 
} 

Конечно, это не сработает, и я не знаю почему. Я читал кое-что о неявных коллекциях, но это не очень помогло мне. Поэтому любая помощь в написании этой функции имеет большую помощь :)

Ошибки я получаю:

Exception in thread "main"  com.thoughtworks.xstream.converters.ConversionException: account : account 
---- Debugging information ---- 
message    : account 
cause-exception  : com.thoughtworks.xstream.mapper.CannotResolveClassException 
cause-message  : account 
class    : java.util.ArrayList 
required-type  : java.util.ArrayList 
converter-type  : com.thoughtworks.xstream.converters.collections.CollectionConverter 
path    : /list/account 
line number   : 1 
version    : 1.4.7 
------------------------------- 
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:79) 
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) 
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134) 
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) 
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1185) 
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1157) 
at com.thoughtworks.xstream.XStream$4.readFromStream(XStream.java:1851) 
at com.thoughtworks.xstream.core.util.CustomObjectInputStream.readObjectOverride(CustomObjectInputStream.java:120) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365) 
at Server.TokenizationWithRMI.main(TokenizationWithRMI.java:67) 
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: account 
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:79) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47) 
at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29) 
at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:70) 
at com.thoughtworks.xstream.converters.collections.CollectionConverter.addCurrentElementToCollection(CollectionConverter.java:98) 
at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:91) 
at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:85) 
at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:80) 
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 
+0

Какие ошибки (трассировки стека и т. Д.) Вы получаете? Какова ваша неудача? – h7r

ответ

1

В xstreamin, вы не добавили псевдоним для Account класса.

XStream xstreamin = new XStream(new StaxDriver()); 
//you need to add this line 
xstreamin.alias("account", Account.class); 
//then the rest of your code... 
Reader someReader = new FileReader("Accounts.xml"); 
ObjectInputStream in = xstreamin.createObjectInputStream(someReader); 
accountsin = (ArrayList<Account>) in.readObject(); 
in.close(); 
+0

Все эти проблемы для такой простой вещи. Я думаю, что самые простые вещи сложнее всего найти. Большое спасибо за ответ :) – pesho

+1

Добро пожаловать. –