Pergunta

Estou um pouco fora do meu elemento. Eu usei xsd.exe para criar um esquema XSD de um arquivo XML, e em seguida, criar uma classe C # daquele XSD. Isso tudo parece funcionar bem.

No momento eu estou apenas tentando obter o XML serializado. O arquivo que estou deserializing se o mesmo arquivo que eu usei para construir a classe originalmente. Aqui está o meu código:

String xsdPath=@"C:\Users\tol56881\Documents\dnd4e.xsd";
String xmlPath=@"C:\Users\tol56881\Documents\dnd4e.xml";
String xsdNamespace="";

//Validation stuff
XmlParserContext context = new XmlParserContext(null, null, "", XmlSpace.None);
XmlValidatingReader vr = new XmlValidatingReader(xmlPath, XmlNodeType.Element, context);
vr.ValidationType = ValidationType.Schema;
vr.Schemas.Add(xsdNamespace, xsdPath);
while (vr.Read()) ;

//Actually reading the file
TextReader tr = new StreamReader(xmlPath);
D20Character character = (D20Character)(new XmlSerializer(typeof(D20Character))).Deserialize(tr);

É bem de compilação, mas quando eu tentar executá-lo eu recebo a um erro que se repete há quatro objetos diferentes. Eu dei um exemplo a seguir, mudando os nomes dos objetos.

Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Namespace.ObjectName[]' to 'Namespace.ObjectName'
error CS0029: Cannot implicitly convert type 'Namespace.ObjectName' to 'Namespace.ObjectName[]'

Assim, parece que o programa está a tentar ir de matriz para objeto e volta a matriz, mas eu realmente não estou certo. O código da classe gerada automaticamente é uma confusão enorme que é difícil de percorrer. Eu estou esperando que talvez haja algo simples que eu estou ausente aqui.

Obrigado!

Foi útil?

Solução

Eu consegui corrigir isso. Cada um dos quatro objectos em questão foram gerados como matrizes duplamente indexados, tais como:

    private loot[][] lootTallyField;

e

    public loot[][] LootTally
    {
        get
        {
            return this.lootTallyField;
        }
        set
        {
            this.lootTallyField = value;
        }
    }

Tudo que eu fiz foi remover um conjunto de suportes, e tudo parece estar funcionando bem. Sem problemas com desserialização e uma rápida inspeção do objeto desserializado faz parecer que os dados foi carregado corretamente.

    private loot[] lootTallyField;

e

    public loot[] LootTally
    {
        get
        {
            return this.lootTallyField;
        }
        set
        {
            this.lootTallyField = value;
        }
    }

Ainda não tenho certeza por que xsd.exe fez estas duplamente indexados se não é suposto ser. Eu sinto que ainda estou faltando alguma coisa, daí por que esta questão ainda está em aberto.

Particularmente, se eu precisar para voltar a gerar o código, então eu preciso reaplicar a correção, que tipo de derrotas a finalidade de usar uma classe parcial em primeiro lugar ...

Outras dicas

Há um problema na ferramenta xsd.exe, vou tentar explicar.

Se você tem um complexType com um interior sequência que tem um complexType criança com uma seqüência e o primeiro não tem quaisquer outros elementos / atributos, em seguida, a classe gerada terá apenas 1 tipo gerado, em vez de 2 e vai ser uma matriz dupla.

Se você fizer a matriz dupla em uma única matriz, você será capaz de desserializar o xml muito bem. No entanto, este irá produzir o seguinte resultado inesperado. Se seus XML é semelhante ao abaixo.

<root>
    <loot>
        <tally>value1</tally>
        <tally>value2</tally>
    </loot>
    <loot>
        <tally>value3</tally>
        <tally>value4</tally>
    </loot>
</root>

Em seguida, o serializado objeto, na matriz lootTally iria conter apenas os itens value3 e VALUE4 em vez de ter todos os 4.

Então, você tem 2 opções para corrigir isso corretamente:

  1. Alter do arquivo xsd adicionando um manequim na primeira sequência, e executar xsd.exe novamente, de modo que quando ele gera a classe não vai criar uma matriz dupla, e então você pode excluir o atributo fictício da classe.
  2. Alter a classe gerada, adicione uma nova classe chamada saque que conterá um array de objetos tally que você já tem (e só precisa alterar o nome).

Por favor note que na opção 2 você pode ter que mudar algumas declarações se você tem um XmlArrayItemAttribute para XmlElementAttribute.

Espero que isso ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top