C#: Сервис WCF с участником IXMLSerializable превращается в DataSet

Я не могу дать комментарий или провалить все же, так как я только что запустил на переполнении стека. Мой комментарий alexsmart (отправленный 23 декабря 2008 12:31) - то, что выражение Вокруг (n/precision, точность), где n является интервалом и точностью, долго, не сделает то, что он думает:

1) n/precision возвратит целочисленное деление, т.е. он будет уже округлен, но Вы не будете в состоянии использовать любые десятичные числа. Округляющееся поведение также отличается от Математики. Вокруг (...).

2) код" Математика возврата. Вокруг (n/precision, точность).ToString () " не компилирует из-за неоднозначности между Математикой. Вокруг (дважды, интервал) и Математика. Вокруг (десятичное число, интервал). Необходимо будет бросить к десятичному числу (не дважды, так как это - финансовое приложение), и поэтому может также пойти с десятичным числом во-первых.

3) n/precision, то, где точность равняется 4, не усечет к четырем десятичным числам, но разделится на 4. Например, Математика. Вокруг ((десятичное число) (1234567/4), 4) возвраты 308641. (1234567/4 = 308641.75), в то время как то, к чему Вы, вероятно, хотели, становятся 1235000 (округленным к точности 4 цифр от запаздывания 567). Отметьте ту Математику. Вокруг позволяет раунду к фиксированной точке, не фиксированной точности.

Обновление: Я могу добавить комментарии теперь, но существует недостаточно пространства для помещения этого в область комментария.

8
задан THX-1138 21 September 2009 в 19:54
поделиться

2 ответа

В общем случае настраиваемая сериализация (через IXmlSerializable ) через SOAP или WCF - плохая идея. Если вы используете совместное использование сборки с WCF (то есть вместо генерации прокси вы отправляете сборку DTO клиенту), тогда она может работать, но по-прежнему нарушает SOA / mex и т. Д. На самом деле, я удивлен, что это не просто дать вам XmlElement или аналогичный, но хех!

Я бы просто сопоставил вашу существующую ( IXmlSerializable ) объектную модель в простых типах, которые могут использовать стандартную сериализацию (т.е. нет IXmlSerializable ).

Кстати; вы смотрели службы данных ADO.NET? Это уже обрабатывает Expression по сети (хотя и не как значение). Для передачи в качестве значений MetaLinq .

4
ответ дан 5 December 2019 в 12:10
поделиться

Я понимаю, что это старый вопрос, но для будущих читателей я обнаружил следующее:

Объекты, реализующие IXmlSerializable , нуждаются в иметь схему, определенную для работы с wsdl, в противном случае платформа .Net не знает, как определить контракт, потому что сериализация является настраиваемой.

Чтобы указать схему, вы не должны использовать метод GetSchema в интерфейсе IXmlSerializable, а используйте атрибут XmlSchemaProvider ( ссылка msdn ). Подробнее об этом можно прочитать в статье Microsoft Расширьте свою сериализацию XML с помощью поставщиков схем в .NET Framework в разделе поставщиков схем.

Вы можете найти примеры как на странице атрибутов XmlSchemaProvider, так и в статье. Я рекомендую хранить ваши схемы в файлах .xsd и читать их, как в примерах. Написание схемы через код в лучшем случае обременительно.

После того, как я реализовал поставщика схемы, сериализация работала, как ожидалось. Если ваша служба WCF размещена в IIS, обратитесь к этому вопросу о том, как получить правильный каталог IIS через отражение Могу ли я использовать отражение, чтобы найти папку bin / [Configuration] в ASP.NET вместо временной папки asp .

Пример из статьи Microsoft:

[XmlRoot(ElementName="product_root", DataType="product_type", 
    Namespace="http://SchemaProvider.Example.org/Product.xsd",
    IsNullable = false)]
[XmlSchemaProviderAttribute("GetSchemaFile")]
public class Product : IXmlSerializable
{ 
    public static XmlSchemaComplexType GetSchemaFile(
        System.Xml.Schema.XmlSchemaSet xs)
    {
        string xsdFile = Directory.GetCurrentDirectory() + 
            "\\Product.xsd";
        XmlSerializer schemaSerializer = 
            new XmlSerializer(typeof(XmlSchema));
        XmlSchema schema = 
            (XmlSchema)schemaSerializer.Deserialize(
                XmlReader.Create(xsdFile));
        xs.Add(schema);

        // target namespace
        string tns = "http://SchemaProvider.Example.org/Product.xsd";  
        XmlQualifiedName name = 
            new XmlQualifiedName("product_type", tns);
        XmlSchemaComplexType productType = 
            (XmlSchemaComplexType) schema.SchemaTypes[name];

        return productType;
    } 

    ...
}
10
ответ дан 5 December 2019 в 12:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: