Я не могу дать комментарий или провалить все же, так как я только что запустил на переполнении стека. Мой комментарий 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). Отметьте ту Математику. Вокруг позволяет раунду к фиксированной точке, не фиксированной точности.
Обновление: Я могу добавить комментарии теперь, но существует недостаточно пространства для помещения этого в область комментария.
В общем случае настраиваемая сериализация (через IXmlSerializable
) через SOAP или WCF - плохая идея. Если вы используете совместное использование сборки с WCF (то есть вместо генерации прокси вы отправляете сборку DTO клиенту), тогда она может работать, но по-прежнему нарушает SOA / mex и т. Д. На самом деле, я удивлен, что это не просто дать вам XmlElement
или аналогичный, но хех!
Я бы просто сопоставил вашу существующую ( IXmlSerializable
) объектную модель в простых типах, которые могут использовать стандартную сериализацию (т.е. нет IXmlSerializable
).
Кстати; вы смотрели службы данных ADO.NET? Это уже обрабатывает Expression
по сети (хотя и не как значение). Для передачи в качестве значений MetaLinq .
Я понимаю, что это старый вопрос, но для будущих читателей я обнаружил следующее:
Объекты, реализующие 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;
}
...
}