小编Sam*_*erg的帖子

JAXB:如何自定义双字段的Xml序列化

我有一个遗留类,有很多公共双字段.所有双字段都初始化Double.MAX_VALUE为表示它们是空的.(遗留序列化编码为忽略字段,如果字段等于则不进行序列化Double.MAX_VALUE).

我们现在尝试使用JAXB Marshaller将此类序列化为Xml.它工作正常,除了我们想要阻止为相等的字段生成Xml Double.MAX_VALUE.

我们没有使用单独的JAXB模式,只是用各种javax.xml.bind.annotation注释标记我们的类.如果使用模式,则可以添加<javaType>元素以指定自定义DataType转换器.有没有办法使用Annotations或以编程方式执行此操作?

在尝试下面推荐的方法后,我仍然无法XmlAdapter接受:

@XmlJavaTypeAdapters({
@XmlJavaTypeAdapter(value=EmptyDoubleValueHandler.class, type=Double.class), @XmlJavaTypeAdapter(value=EmptyDoubleValueHandler.class, type=double.class)})
package tta.penstock.data.iserver;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
Run Code Online (Sandbox Code Playgroud)

我的顶级课程是:tta.penstock.data.iserver.OrderBlotter,其中包含一个扩展的tta.penstock.data.iserver.OrderResponseWrappers列表com.eztech.OrderResponse.所有双字段都包含在com.eztech.OrderResponse.

我的单元测试代码执行以下操作:

JAXBContext context = JAXBContext.newInstance(new Class[] { OrderBlotter.class, OrderResponseWrapper.class, OrderResponse.class});

Marshaller marshaller = context.createMarshaller();
StringWriter stringWriter = new StringWriter();
marshaller.marshal(blotter, stringWriter);
System.out.println("result xml=\n" + stringWriter.toString());
Run Code Online (Sandbox Code Playgroud)

但双重值仍然没有得到处理XmlAdapter.我知道我遗漏了一些基本的东西,但我不确定它是什么.

java jaxb xml-serialization

7
推荐指数
1
解决办法
1万
查看次数

为什么有一个定义_t​​main的宏?

我是C++编码的新手,来自Java和C#背景.我对最基本的#define术语的扩散感到困惑:

#define _tmain wmain
Run Code Online (Sandbox Code Playgroud)

当我第一次学习C语言时,我的主要功能是:

int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

在我创建的Visual C++项目中,它创建了主要功能:

int _tmain(int argc, _TCHAR* argv[])
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么要起个名翻译需要wmain_tmain?为什么不使用原始的C main函数原型?

一般来说,似乎有很多#define重命名的东西,看起来很清楚,看起来更神秘,更不清楚(我的意思wmain_tmain?).

感谢您容忍可能是一个非常明显的问题.

c++ macros tchar character-encoding visual-c++

7
推荐指数
2
解决办法
1751
查看次数

简单的方法找到2个字典之间的"关键"差异?

我需要比较2个字典,以便在一个字典中找到不在另一个字典中的密钥集.

我知道Python 设置对象支持:

set3=set1-set2
Run Code Online (Sandbox Code Playgroud)

但我做不到:

dict3=dict1-dict2
Run Code Online (Sandbox Code Playgroud)

要么:

missingKeys=dict1.keys()-dict2.keys()
Run Code Online (Sandbox Code Playgroud)

(我对最后一点感到有些惊讶,因为在Java中,键是一个Set对象.)一种解决方案是:

missingKeys=set(dict1.keys())-set(dict2.keys())
Run Code Online (Sandbox Code Playgroud)

有没有更好或更简洁的方法来做到这一点?

python dictionary set set-difference

6
推荐指数
2
解决办法
5145
查看次数

为什么不能在其包的__init__.py中声明模块访问属性?

我有一个包结构如下:

mypackage
  __init__.py
  mymodule.py
Run Code Online (Sandbox Code Playgroud)

我把一些"常量"声明放在__init__.py例如:

DELIMITER='\x01'
Run Code Online (Sandbox Code Playgroud)

但是,mymodule.py中的代码无法访问DELIMITER,除非我添加:

from __init__ import *
Run Code Online (Sandbox Code Playgroud)

mymodule.py文件的顶部.我想我在这里错过了一个概念.是什么声明的内容在__init__.py通过import语句访问之前不会被读入内存?另外,这是放入__init__.py文件的典型类型吗?

python module packages

6
推荐指数
1
解决办法
1927
查看次数

当枚举类型引用是Class <?>时,如何将String转换为枚举值?

我有使用setter方法在对象上设置值的代码.其中一个setter将Enum类型作为方法参数.代码看起来像这样:

    String value = "EnumValue1";
    Method setter = getBeanWriteMethod("setMyEnumValue");
    Class<?> type = setter.getParameterTypes()[0];
    Object convertedValue = null;
    if (type.isEnum()) {
       convertedValue = convertToEnum(value, type);
    } else {
       convertedValue = ClassUtils.convertType(value, type);
    }
    return convertedValue;
Run Code Online (Sandbox Code Playgroud)

问题是该convertToEnum方法应该放什么.我知道我可以通过迭代对象的枚举常量(或字段)来"强制它" type,匹配值.我是否忽略了使用Reflection进行更简单的方法?(我查看了几个例子,但没有找到任何枚举只能通过Class知道的地方).

java reflection enums

6
推荐指数
1
解决办法
1万
查看次数

J2EE应用程序/ Bean配置最佳实践?

管理属性集以应用于EJB的最佳方法是什么,并且可以轻松地在机器/环境(例如DEV,TEST,PROD)之间进行更改?例如,有没有办法在App Server上配置EJB属性(这可以保证您可以根据计算机/环境改变它们).

特别:

1)我有一个Singleton EJB,需要特定的某些属性集(环境).是否有注释用于告诉EJB容器在哪里查找这些属性并自动将它们应用于bean?

2)管理不同属性集的最佳方法是什么,即dev,test,prod,以便J2EE应用程序可以在服务器之间移植,并且您可以无缝地管理特定于每个服务器的属性?

如果有任何良好的文档链接 - 让我知道.我用Google搜索并没有直接看到上述各点.

configuration stateless-session-bean configuration-management java-ee

5
推荐指数
1
解决办法
877
查看次数

WatchService (Windows 7):删除文件时,它会同时触发 ENTRY_MODIFY 和 ENTRY_DELETE 事件?

在使用 WatchService 时,我发现如果我删除正在监视的目录中的文件,它会触发ENTRY_MODIFY一个ENTRY_DELETE事件,然后是一个事件。

我意识到从技术上讲,文件在删除之前可能会被修改,但是删除文件会触发 ENTRY_MODIFY(大概没人关心)真的是预期的行为吗?

为了解决这个问题,我必须在触发传递 ENTRY_MODIFY 事件之前添加一个条件来检查:

            if (eventKind == ENTRY_CREATE) {
                listener.fileCreated(file);
            } else if (eventKind == ENTRY_MODIFY) {
                if (Files.exists(fullPath, LinkOption.NOFOLLOW_LINKS)) {
                    listener.fileChanged(file);
                }
            } else if (eventKind == ENTRY_DELETE) {
                listener.fileDeleted(file);
            }
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来处理这个问题(功能)?

java watchservice

5
推荐指数
1
解决办法
803
查看次数

按类型动态调度仅在运行时已知

我一直在代码中遇到对相同模式的需求,这经常需要验证对象中所有属性的值。伪代码如下所示:

bool ValidateMe(object c) {
   var properties = GetProperties(c);
   foreach (var property in properties) {
        var value = property.GetValue(c);
        if (!IsValid(value)) {
            return false;
        }
   }
   return true;
}

bool IsValid(int value)
{
    return value != int.MaxValue;
}

bool IsValid(double value)
{
    return value != double.MaxValue;
}

bool IsValid(object value)
{
    return value != null;
}  // etc.
Run Code Online (Sandbox Code Playgroud)

我希望代码根据对象的类型(可以通过调用property.PropertTypevalue.GetType()假设值不为空来找到)动态地将值分派到正确的方法。

我发现实现这项工作的唯一方法是这样的:

interface IValidator {
    bool IsValid(object value);
}

class PredicateValidator<T> : IValidator {
    private Predicate<T> method;
    PredicateValidator(Predicate<T> …
Run Code Online (Sandbox Code Playgroud)

c# reflection

5
推荐指数
1
解决办法
2717
查看次数

Visual C++ 发行版本 - 当通过 DLL 传递时,字符串是否会因为使用不同的运行时版本编译而损坏?

在发布模式下构建后,我看到了在调试模式下未发生的异常。调试发布版本时,字符串引用似乎没有从 EXE(我们的应用程序)正确传递到接收字符串引用的 DLL。

我们的 EXE 代码如下所示:

string contents = "handle_message(): received=" + msg->encode();
LOG4CXX_DEBUG(logger, contents);
Run Code Online (Sandbox Code Playgroud)

LOG4CXX_DEBUGlog4cxx.dll,其代码如下所示:

CharMessageBuffer& CharMessageBuffer::operator<<(const std::basic_string<char>& msg) {
   if (stream == 0) {
      buf.append(msg);
   } else {
      *stream << msg;
   }
   return *this;
}
Run Code Online (Sandbox Code Playgroud)

查看调试器中的调用堆栈,当我向下导航到包含源代码的框架时,我可以看到这contents是一个带有size=583, capacity=838.

log4cxx.dll在(堆栈中上面的下一帧) 内部的帧中,字符串引用显示size=838, capacity=363113231(并且值都是垃圾)。

我们的应用程序和 log4cxx.dll 都是在同一台计算机上编译的,使用相同的运行时设置 (/MD),但 Visual Studio 版本不同。log4cxx dll 是使用 Visual Studio 2008 编译的,我们的应用程序是使用 Visual Studio 2010 编译的。在 2 个对象上运行 dumpbin 显示:

我们的应用程序(EXE)

MSVCP100.dll
MSVCR100.dll
Run Code Online (Sandbox Code Playgroud)

log4cxx.dll (DLL)

MSVCP90.dll …
Run Code Online (Sandbox Code Playgroud)

dll corruption visual-c++

4
推荐指数
1
解决办法
2133
查看次数

g++ unordered_map 没有 at() 函数?

我一直在使用 Visual Studio 2010 进行开发,然后在另一台机器上编译 Linux 64 版本。为了涵盖 2 个不同编译器/环境之间的差异,我们有条件包含语句:

#ifdef __linux__
#include <tr1/unordered_map>
#endif

#ifdef _WIN32
#include <unordered_map>
#endif 
using namespace std;  // covers std::unordered_map
using namespace std::tr1; // covers tr/unordered_map

unordered_map<string,string> map;
Run Code Online (Sandbox Code Playgroud)

对于unordered_map,我一直在使用此文档: cplusplus.com,它显示了at()在地图中查找键的方法。(与[]运算符不同,如果未找到,则不会将键插入到地图中。)

当我试图在 Linux 机器上编译代码时,gcc 抛出一个错误说

test_map.cpp:18: 错误: 'class std::tr1::unordered_map, std::allocator >, std::basic_string, std::allocator >, std::tr1::hash, std::allocator > >, std::equal_to, std::allocator > >, std::allocator, std::allocator >, std::basic_string, std::allocator > > >, false>'没有名为'at'的成员

本机gcc的版本是:

g++ (GCC) 4.1.2 20080704(红帽 4.1.2-46)

我尝试在较新的 …

c++ gcc unordered-map

4
推荐指数
1
解决办法
4395
查看次数